如何在对Oracle 10g的JDBC SQL查询中包含多个命令?
我对Oracle完全陌生(我来自MySQL和MSSQL),并且是JDBC的新手。我的一个表创建查询如下所示:如何在对Oracle 10g的JDBC SQL查询中包含多个命令?,oracle,jdbc,oracle10g,ora-00911,Oracle,Jdbc,Oracle10g,Ora 00911,我对Oracle完全陌生(我来自MySQL和MSSQL),并且是JDBC的新手。我的一个表创建查询如下所示: CREATE TABLE "LISTS" ("ID" NUMBER NOT NULL ENABLE, "NAME" VARCHAR2(1000) NOT NULL ENABLE, "DOMAIN_ID" NUMBER NOT NULL ENABLE, CONSTRAINT "LISTS_PK" PRIMARY KEY ("ID") ENABLE
CREATE TABLE "LISTS"
("ID" NUMBER NOT NULL ENABLE,
"NAME" VARCHAR2(1000) NOT NULL ENABLE,
"DOMAIN_ID" NUMBER NOT NULL ENABLE,
CONSTRAINT "LISTS_PK" PRIMARY KEY ("ID") ENABLE
)
/
CREATE OR REPLACE TRIGGER "BI_LISTS"
before insert on "LISTS"
for each row
begin
select "LISTS_SEQ".nextval into :NEW.ID from dual;
end;
/
ALTER TRIGGER "BI_LISTS" ENABLE
/
当我尝试connection.createStatement().execute()
此查询时,我得到java.sql.SQLSyntaxErrorException:ORA-00922:缺少或无效选项
。如果我去掉斜线,我也会得到同样的结果。如果我尝试用分号替换它们,我会得到java.sql.SQLSyntaxErrorException:ORA-00911:无效字符
在JDBC和/或Oracle中,在一个查询中不可能包含多个命令吗?或者我只是缺少某种语法来分隔它们?它们都是独立的语句。通过
连接#createStatement()
或通过对语句#执行(字符串)
的多个SQL调用,通过单独的语句对象一次发出一个
相反,您希望它们出现在一个描述语句中的原因是什么?每一个都是单独的语句。通过
连接#createStatement()
或通过对语句#执行(字符串)
的多个SQL调用,通过单独的语句对象一次发出一个
相反,您希望它们出现在一个描述语句中的原因是什么?对于oracle,如果您在开始和结束之间包含sql;它应该会起作用 例:
对于oracle,如果在开始和结束之间包含sql;它应该会起作用 例:
它们是一个语句并不重要(我在发布之前将它们分成三个字符串作为解决方法),我只是想看看我是否遗漏了什么和/或做错了什么。谢谢你可以用一些Oracles特有的语法欺骗JDBC,但JDBC的对象模型实际上是为了将语句级命令传递给DB,因为每个命令都可能有响应/异常。有意义=)大多数情况下,我感到困惑的是,Oracle/Apex本身吐出的sql文件在我试图通过Apex或JDBC运行时返回为无效语法。它们是否正确并不重要是一个语句(在发布之前,我将它们分成三个字符串作为解决方法),我只是想看看我是否遗漏了一些内容和/或做错了。谢谢你可以用一些Oracles特有的语法欺骗JDBC,但JDBC的对象模型实际上是为了将语句级命令传递给DB,因为每个命令都可能有响应/异常。有意义=)大多数情况下,我感到困惑的是,Oracle/Apex本身吐出的sql文件在我试图通过Apex或JDBC运行时返回为无效语法。我认为这是唯一适用的对于UPDATE/INSERT/DELETE语句-当我的SQL具有CREATE/DROP语句时,我无法使其工作以下操作对我有效:
String wa=“”声明v_命令VARCHAR2(32767);BEGIN v_命令:=“创建或替换名为$clsName并将其编译为$clsDef”的JAVA源代码;执行立即v_命令;END;””jdbcTemplate.execute(wa)
还要注意,create语句是DDL,而Update(etc)语句是DML。我不建议在PLSQL中聚合DML,而是执行批处理。我认为这只适用于UPDATE/INSERT/DELETE语句-当我的SQL有CREATE/DROP语句时,我无法让它工作以下内容对我有效:String wa=“””DECLARE v_command VARCHAR2(32767);BEGIN v_命令:='CREATE或REPLACE并将名为$clsName的JAVA源代码编译为$clsDef';EXECUTE IMMEDIATE v_命令;END;“”“jdbcTemplate.EXECUTE(wa)
另请注意,CREATE语句是DDL,而Update(etc)语句是DML。我不建议在PLSQL中聚合DML,而是建议执行批处理。
BEGIN
CREATE TABLE "LISTS"
("ID" NUMBER NOT NULL ENABLE,
"NAME" VARCHAR2(1000) NOT NULL ENABLE,
"DOMAIN_ID" NUMBER NOT NULL ENABLE,
CONSTRAINT "LISTS_PK" PRIMARY KEY ("ID") ENABLE
)
;
CREATE OR REPLACE TRIGGER "BI_LISTS"
before insert on "LISTS"
for each row
begin
select "LISTS_SEQ".nextval into :NEW.ID from dual;
end;
;
ALTER TRIGGER "BI_LISTS" ENABLE;
END;