如何在对Oracle DB的Java调用中运行多个顺序语句?
我试图删除一个表,创建它,然后在对Oracle DB的单个Java语句调用中填充它 我尝试在两次调用之间的新行上用“/”分隔语句。这在sqldeveloper中工作,但通过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
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文件中的语句之间放置了一个特定的中断标识符,并对其进行拆分,然后在您的响应中运行它。