我的陈述:
statement.addBatch("START TRANSACTION;" +
"UPDATE FIRST_TABLE SET FIRST_FIELD = 1;" +
"UPDATE SECOND_TABLE SET SECOND_FIELD = 2;" +
"UPDATE THIRD_TABLE SET THIRD_FIELD = 3;" +
"COMMIT;");
下一行会抛出异常:
statement.executeBatch();
如果我使用方法execute
:
statement.execute(myTransaction);
例外:
java.sql.BatchUpdateException: ORA-00900: invalid SQL statement
我使用Oracle。如果我在命令行或SQL IDE中执行此语句,我没有任何异常。在这种情况下它可以正常工作。仅在java代码中存在此异常。有什么问题?
答案 0 :(得分:3)
尝试,
connection.setAutoCommit(false);
statement.addBatch("UPDATE FIRST_TABLE SET FIRST_FIELD = 1");
statement.addBatch("UPDATE SECOND_TABLE SET SECOND_FIELD = 2");
statement.addBatch("UPDATE THIRD_TABLE SET THIRD_FIELD = 3");
int [] counts = statement.executeBatch();
connection.commit();
答案 1 :(得分:1)
尝试在单独的addBatch()
答案 2 :(得分:0)
通常,您将使用连接的setAutoCommit()方法来启动事务,运行语句,最后适当地调用commit()或rollback()。这是一种与数据库无关的交易方式。不确定,为什么要为同一个构建SQL!你能详细说明你的用例吗?
Connection con = dataSource.getConnection();
try {
con.setAutoCommit(false);
Statement stmt = con.prepareStatement("<your update statement with placeholders for parameters");
stmt.set(1, <Value1>);
stmt.set(2, <Value2>);
stmt.execute();
con.commit();
}
catch (SQLException sqle) {
// Handle the exception
con.rollback();
}
finally {
con.close();
}
注意:上面的代码在获取连接时和关闭它时有很多要处理的角落情况,现在就省去了它看起来很简单!
答案 3 :(得分:0)
作为旁注,为了创建一批SQL,您必须单独将每个语句添加到批处理中。
所以,而不是:
statement.addBatch("START TRANSACTION;" +
"UPDATE FIRST_TABLE SET FIRST_FIELD = 1;" +
"UPDATE SECOND_TABLE SET SECOND_FIELD = 2;" +
"UPDATE THIRD_TABLE SET THIRD_FIELD = 3;" +
"COMMIT;");
使用:
statement.addBatch("START TRANSACTION;");
statement.addBatch("UPDATE FIRST_TABLE SET FIRST_FIELD = 1;");
....
但是,这不是运行事务的标准方法。要运行交易:
con.setAutoCommit(false); //so that a transaction is not committed after each
//statement
//run you queries
statement.executeUpdate(); //or statement.executeBatch();
...
//in the end commit
con.commit();