簡體   English   中英

如何從Java執行多個SQL語句

[英]How to execute multiple SQL statements from java

我想一次執行多個查詢或作業。 像這樣的東西:

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

或多個選擇查詢。查詢將是動態的。

但是我無法做到這一點,以半冒號分隔的多個查詢的運行方式是什么?

您可以使用以下示例來實現這一點,該示例使用addBatch和executeBatch命令同時執行多個SQL命令。

批處理允許您將相關的SQL語句分組為一個批處理,並通過一次調用將其提交給數據庫。 參考

當您一次向數據庫發送多個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

我不確定您是否要在一個請求語句中發送兩個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語句和一個SELECT,那么您的數據庫應該能夠支持一個SQL String 例如,我在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 ,以便在各步之間有空白。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM