【问题标题】:How to include multiple commands in a JDBC SQL query to Oracle 10g?如何在 Oracle 10g 的 JDBC SQL 查询中包含多个命令?
【发布时间】:2011-05-23 04:38:47
【问题描述】:

我是 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 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: missing or invalid option。如果我删除斜线,我会得到相同的结果。如果我尝试用分号替换它们,我会得到java.sql.SQLSyntaxErrorException: ORA-00911: invalid character

难道不能在 JDBC 和/或 Oracle 的一个查询中包含多个命令吗?还是我只是缺少某种语法来分隔它们?

【问题讨论】:

    标签: oracle jdbc oracle10g ora-00911


    【解决方案1】:

    对于 oracle,如果您在 BEGIN 和 END 之间包含您的 sql;它应该工作。

    例如:

    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;
    

    【讨论】:

    • 我认为这仅适用于 UPDATE/INSERT/DELETE 语句 - 当我的 SQL 有 CREATE/DROP 语句时,我无法让它工作
    • 以下对我有用:String wa = """DECLARE v_command VARCHAR2(32767); BEGIN v_command :='CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED $clsName AS $clsDef'; EXECUTE IMMEDIATE v_command; END;""" jdbcTemplate.execute(wa)
    • 另请注意,create 语句是 DDL,而 Update(etc) 语句是 DML。我不建议在 PLSQL 中聚合 DML,而是进行批处理。
    【解决方案2】:

    每一个都是单独的语句。通过 Connection#createStatement() 的单独 Statement 对象或通过对 Statement#execute(String) 的多个 SQL 调用一次发出一个。

    相反,您希望它们在一个描述性声明中的原因是什么?

    【讨论】:

    • 它们是一个语句并不是那么重要(我在发布之前将它们分成三个字符串作为解决方法),我只是想看看我是否遗漏了什么和/或做错了什么.谢谢!
    • 你可以用一些特定于 Oracle 的语法来欺骗 JDBC,但 JDBC 的对象模型确实旨在将语句级命令传递给数据库,因为每个命令都可能有响应/异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多