2

1 つの PreparedStatement で複数の種類のデータベース呼び出しをバッチ処理したいと考えています。これは可能ですか?

とにかく何かをすることはありますか

PreparedStatement pstmt = connection.prepareStatement("?");

どこ ?であるか、そうINSERT INTO MY_TABLE VALUES(1,2,3,4)である可能性がありますUPDATE MY_TABLE, SET MY_VAL='1' WHERE MY_VAL IS NULL

または、準備済みステートメントのテーブルとアクションを常に指定する必要がありますか?

4

3 に答える 3

3

Java では ? だけを追加することはできません。準備済みステートメント文字列パラメーターで、? 指定された SQL へのパラメーターのみのプレースホルダー。

あなたの場合、2 つの準備済みステートメント オブジェクトが必要になる場合があり、ループ スルーで、どちらを呼び出すかを決定できます。したがって、以下のようなものになります。

PreparedStatement insertPstmt = connection.prepareStatement("INSERT INTO MY_TABLE VALUES(?,?,?,?)");
PreparedStatement updatePstmt = connection.prepareStatement("UPDATE MY_TABLE, SET MY_VAL=? WHERE MY_VAL IS NULL");

While (<condition>) {
  If (<insert condition>) {
    // use insert pstmt and add batch
  } else {
    // use update pstmt and add batch
  }
}

insertPstmt.executeBatch(); 
updatePstmt.executeBatch();

更新に依存する insert がある場合は、それに応じてバッチを実行できます。これにより、更新が正しく機能することが確認されます。更新に依存しない可能性があるため、最初に挿入を実行することを考えます。

于 2012-12-12T17:56:32.427 に答える
0

PreparedStatementで、最初の実行のために変数をバインドした後、

pstmt.addBatch();

次に、次の変数をバインドし、そのたびにaddBatch()を呼び出します。次に、バッチの追加が完了したら、すべてを実行してbacthを実行します。

pstmt.executeBatch();

見る :

http://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html#addBatch%28%29

http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#executeBatch%28%29

ところで:ステートメント全体を変数に注入することは機能しません。このバッチメカニズムは、毎回異なる変数をバインドする同じステートメントを再利用するために存在します。

于 2012-12-12T16:05:00.093 に答える
0

Insert コマンドと Update コマンドは、処理が必要なデータを返しません。例のようなことをしたい場合は、実行されていないクエリ コマンドを実行し、セミコロンで区切られたすべての SQL 文字列を連結した文字列を提供するだけです。

"INSERT INTO MY_TABLE VALUES(1,2,3,4)" + ";"  +"UPDATE MY_TABLE, SET MY_VAL='1' WHERE MY_VAL IS NULL" + ";" +...

その場合、ステートメントを準備する必要はなく、そうすることでパフォーマンスが向上することもありません。

于 2012-12-12T16:16:53.330 に答える