0

我的声明:

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

我使用甲骨文。如果我在命令行或 SQL IDE 中执行此语句,我没有任何异常。在这种情况下它可以正常工作。仅在 java 代码中存在此异常。怎么了?

4

4 回答 4

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();
于 2012-08-15T08:45:47.947 回答
1

尝试将每个更新语句添加到单独的addBatch()

于 2012-08-15T08:45:29.227 回答
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();
}

注意:在上面的代码中,在获取连接和关闭连接时有很多极端情况需要处理,为了让这看起来简单,暂时省略了!

于 2012-08-15T08:43:11.800 回答
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();
于 2012-08-15T08:46:01.210 回答