如何在对Oracle DB的Java调用中运行多个顺序语句?

如何在对Oracle DB的Java调用中运行多个顺序语句?,java,oracle,plsql,Java,Oracle,Plsql,我试图删除一个表,创建它,然后在对Oracle DB的单个Java语句调用中填充它 我尝试在两次调用之间的新行上用“/”分隔语句。这在sqldeveloper中工作,但通过Java运行它会给我一个错误 BEGIN EXECUTE IMMEDIATE 'DROP TABLE FOO'; EXCEPTION WHEN OTHERS THEN IF sqlcode != -0942 THEN RAISE; END IF; END; / CREATE TABLE FOO ( PREFI

我试图删除一个表,创建它,然后在对Oracle DB的单个Java语句调用中填充它

我尝试在两次调用之间的新行上用“/”分隔语句。这在sqldeveloper中工作,但通过Java运行它会给我一个错误

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE FOO';
EXCEPTION
  WHEN OTHERS THEN
IF sqlcode != -0942 THEN RAISE; 
END IF;
END;
/

CREATE TABLE FOO ( 
  PREFIX_SIZE number(2) NOT NULL,
  MASK number(10) NOT NULL  );
/  

BEGIN
FOR i IN 0..32 LOOP
    INSERT INTO FOO
    SELECT i, i*640 FROM DUAL;
END LOOP;
END;
这在SQL Developer中有效,但通过Java运行会出现以下错误:

ORA-06550:第1行第126列: PLS-00103:遇到符号“/”

Java代码:

try { 
    query = null; 
    loadSqlScript("create_table_foo.sql"); 
    preparedStatement = connection.prepareStatement(query);    
    preparedStatement.execute(); } 
catch......

loadSqlScript只是将前面提到的代码分配给查询字符串

一次运行一条语句

由于您似乎正在从文本文件中读取整个脚本,因此只使用
/
将字符串拆分成几行,然后执行每个段

String fullSql = loadSqlScript("create_table_foo.sql"); 

conn.setAutoCommit(false);
try (Statement stmt = conn.createStatement()) {
    for (String sql : fullSql.split("(?m)^/\\s*\\R")) {
        stmt.execute(sql);
    }
}
conn.commit();

您可以将这三条语句组合成一个PL/SQL块,只需要一次调用。该代码比原始代码要复杂一些,因为它需要动态SQL来运行DDL并插入到编译时不存在的表中。但它将节省一些Java代码,并可能通过减少网络开销来提高性能

BEGIN
  BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE FOO';
  EXCEPTION
    WHEN OTHERS THEN
  IF sqlcode != -0942 THEN RAISE; 
  END IF;
  END;

  EXECUTE IMMEDIATE '
    CREATE TABLE FOO ( 
    PREFIX_SIZE number(2) NOT NULL,
    MASK number(10) NOT NULL  )';

  EXECUTE IMMEDIATE '
    BEGIN
      FOR i IN 0..32 LOOP
          INSERT INTO FOO
          SELECT i, i*640 FROM DUAL;
      END LOOP;
    END;';
END;
/

可能有助于发布Java代码?如果你要用Java将这些代码放在一个字符串中,你可能需要为每个
/
添加你的问题和Java代码,而不是在评论中发布它;我在SQL文件中的语句之间放置了一个特定的中断标识符,并对其进行拆分,然后在您的响应中运行它。