30

複数のクエリまたはジョブを 1 回の実行で実行したい。このようなもの例えば:

String query="select * from tab1;insert into tab1 values(...);update tab1..;delete from tab1...;"
Statement st = con1.createStatement();
ResultSet rs = st.executeQuery(query); 

または複数の選択クエリ。クエリは動的になります。

しかし、私はこれを行うことができません。セミコロンで区切られた複数のクエリを実行する方法は何ですか?

4

2 に答える 2

39

次の例では、addBatch および executeBatch コマンドを使用して、複数のSQLコマンドを同時に実行します。

バッチ処理を使用すると、関連する SQL ステートメントをバッチにグループ化し、データベースへの 1 回の呼び出しでそれらを送信できます。参照

一度に複数の SQL ステートメントをデータベースに送信すると、通信オーバーヘッドの量が減るため、パフォーマンスが向上します。

  • この機能をサポートするために JDBC ドライバーは必要ありません。メソッドを使用してDatabaseMetaData.supportsBatchUpdates()、ターゲット データベースがバッチ更新処理をサポートしているかどうかを判断する必要があります。JDBC ドライバーがこの機能をサポートしている場合、このメソッドは true を返します。
  • Statement、PreparedStatement、および CallableStatementのaddBatch ()メソッドを使用して、個々のステートメントをバッチに追加します。executeBatch()、グループ化されたすべてのステートメントの実行を開始するために使用されます。
  • executeBatch ()は整数の配列を返し、配列の各要素はそれぞれの更新ステートメントの更新カウントを表します。
  • バッチにステートメントを追加して処理できるように、clearBatch ()メソッドを使用してステートメントを削除できます。このメソッドは、メソッドで追加したすべてのステートメントを削除しますaddBatch()。ただし、削除するステートメントを選択的に選択することはできません。

例:

import java.sql.*;

public class jdbcConn {
   public static void main(String[] args) throws Exception{
      Class.forName("org.apache.derby.jdbc.ClientDriver");
      Connection con = DriverManager.getConnection
      ("jdbc:derby://localhost:1527/testDb","name","pass");

      Statement stmt = con.createStatement
      (ResultSet.TYPE_SCROLL_SENSITIVE,
      ResultSet.CONCUR_UPDATABLE);
      String insertEmp1 = "insert into emp values
      (10,'jay','trainee')";
      String insertEmp2 = "insert into emp values
      (11,'jayes','trainee')";
      String insertEmp3 = "insert into emp values
      (12,'shail','trainee')";
      con.setAutoCommit(false);
      stmt.addBatch(insertEmp1);//inserting Query in stmt
      stmt.addBatch(insertEmp2);
      stmt.addBatch(insertEmp3);
      ResultSet rs = stmt.executeQuery("select * from emp");
      rs.last();
      System.out.println("rows before batch execution= "
      + rs.getRow());
      stmt.executeBatch();
      con.commit();
      System.out.println("Batch executed");
      rs = stmt.executeQuery("select * from emp");
      rs.last();
      System.out.println("rows after batch execution= "
      + rs.getRow());
   }
} 

http://www.tutorialspoint.com/javaexamples/jdbc_executebatch.htmを参照してください

于 2012-06-07T09:45:48.010 に答える
5

両方にアクセスできない可能性があるため、1 つの要求ステートメントで 2 つの SELECT ステートメントを送信する必要があるかどうかはわかりませんResultSet。データベースは、最後の結果セットのみを返す場合があります。

複数の結果セット

ただし、複数の結果セットを返すことがわかっているストアド プロシージャを呼び出している場合は、次のようなものが機能します。

CallableStatement stmt = con.prepareCall(...);
try {
...

boolean results = stmt.execute();

while (results) {
    ResultSet rs = stmt.getResultSet();
    try {
    while (rs.next()) {
        // read the data
    }
    } finally {
        try { rs.close(); } catch (Throwable ignore) {}
    }

    // are there anymore result sets?
    results = stmt.getMoreResults();
}
} finally {
    try { stmt.close(); } catch (Throwable ignore) {}
}

複数の SQL ステートメント

複数のSQLステートメントと1つのSELECTのみについて話している場合、データベースはStringSQLの1つをサポートできるはずです。たとえば、Sybaseでこのようなものを使用しました

StringBuffer sql = new StringBuffer( "SET rowcount 100" );
sql.append( " SELECT * FROM tbl_books ..." );
sql.append( " SET rowcount 0" );

stmt = conn.prepareStatement( sql.toString() );

これは、データベースでサポートされている構文によって異なります。この例spacesでは、ステートメント間に空白ができるように、ステートメントに追加のパディングを行っていることに注意してください。

于 2012-06-07T10:14:06.190 に答える