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

私はOracleを使用しています。このステートメントをコマンドラインまたはSQLIDEで実行しても、例外はありません。この場合は正しく機能します。この例外は、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()を適切に呼び出します。これは、トランザクションで機能するDBに依存しない方法の一種です。わからない、なぜあなたは同じために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 に答える