Cómo ejecutar múltiples sentencias SQL desde Java

Quiero ejecutar las múltiples consultas o trabajo en una ejecución. Algo como esto, por ejemplo:

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

O múltiples consultas de selección. Las preguntas serán dinámicas.

Pero no puedo hacer esto. ¿Cuál es la forma de ejecutar múltiples consultas separadas por punto y coma?

puede lograrlo utilizando el ejemplo siguiente. Utiliza los comandos addBatch y executeBatch para ejecutar múltiples comandos SQL simultáneamente.

El procesamiento por lotes le permite agrupar declaraciones SQL relacionadas en un lote y enviarlas con una sola llamada a la base de datos. referencia

Cuando envía varias sentencias SQL a la base de datos a la vez, reduce la cantidad de gastos generales de comunicación, mejorando así el rendimiento.

  • Los controladores JDBC no son necesarios para admitir esta función. Debe usar el método DatabaseMetaData.supportsBatchUpdates() para determinar si la base de datos de destino admite el procesamiento de actualización por lotes. El método devuelve verdadero si su controlador JDBC es compatible con esta característica.
  • El método addBatch () de Statement, PreparedStatement y CallableStatement se usa para agregar instrucciones individuales al lote. El executeBatch() se usa para iniciar la ejecución de todas las declaraciones agrupadas.
  • El executeBatch () devuelve una matriz de enteros, y cada elemento de la matriz representa el recuento de actualizaciones para la statement de actualización respectiva.
  • Del mismo modo que puede agregar declaraciones a un lote para su procesamiento, puede eliminarlas con el método clearBatch () . Este método elimina todas las instrucciones que agregó con el método addBatch() . Sin embargo, no puede elegir selectivamente qué statement eliminar.

EJEMPLO:

 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()); } } 

consulte http://www.tutorialspoint.com/javaexamples/jdbc_executebatch.htm

No estoy seguro de que desee enviar dos declaraciones SELECT en una statement de solicitud porque es posible que no pueda acceder a ambas ResultSet . La base de datos solo puede devolver el último conjunto de resultados.

Múltiples ResultSets

Sin embargo, si llama a un procedimiento almacenado que sabe que puede devolver resultados múltiples, algo como esto funcionará

 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) {} } 

Múltiples declaraciones SQL

Si está hablando de múltiples sentencias SQL y solo una SELECCIÓN, entonces su base de datos debería ser capaz de soportar la única String de SQL. Por ejemplo, he usado algo como esto en Sybase

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

Esto dependerá de la syntax soportada por su base de datos. En este ejemplo, observe los spaces adicionales spaces rellenan las declaraciones para que haya espacio en blanco entre las declaraciones.