Je veux exécuter les multiples requêtes ou tâches en une seule exécution. Quelque chose comme ça, par exemple:
String query="select * from tab1;insert into tab1 values(...);update tab1..;delete from tab1...;"
Statement st = con1.createStatement();
ResultSet rs = st.executeQuery(query);
Ou plusieurs requêtes sélectionnées. Les requêtes seront dynamiques.
Mais je ne suis pas en mesure de le faire. Quelle est la façon d'exécuter plusieurs requêtes séparées par des points-virgules.
vous pouvez réaliser cela en utilisant l'exemple suivant utilise les commandes addBatch et executeBatch pour exécuter plusieurs commandes [~ # ~] sql [~ # ~] simultanément.
Le traitement par lots vous permet de regrouper des instructions SQL associées dans un lot et de les soumettre en un seul appel à la base de données. référence
Lorsque vous envoyez plusieurs instructions SQL à la base de données à la fois, vous réduisez le volume de communication, améliorant ainsi les performances.
DatabaseMetaData.supportsBatchUpdates()
pour déterminer si la base de données cible prend en charge le traitement de mise à jour par lots. La méthode renvoie true si votre pilote JDBC prend en charge cette fonctionnalité.executeBatch()
est utilisée pour démarrer l'exécution de toutes les instructions regroupées.addBatch()
. Cependant, vous ne pouvez pas choisir de manière sélective l'instruction à supprimer.EXEMPLE:
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());
}
}
référez-vous http://www.tutorialspoint.com/javaexamples/jdbc_executebatch.htm
Je ne suis pas sûr que vous souhaitiez envoyer deux instructions SELECT dans une instruction request, car vous ne pourrez peut-être pas accéder aux deux ResultSet
s. La base de données ne peut renvoyer que le dernier jeu de résultats.
plusieurs jeux de résultats
Cependant, si vous appelez une procédure stockée dont vous savez qu'elle peut renvoyer plusieurs jeux de résultats, quelque chose comme cela fonctionnera
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) {}
}
plusieurs instructions SQL
Si vous parlez de plusieurs instructions SQL et d'un seul SELECT, votre base de données devrait pouvoir prendre en charge celle String
de SQL. Par exemple, j'ai utilisé quelque chose comme ça sur Sybase
StringBuffer sql = new StringBuffer( "SET rowcount 100" );
sql.append( " SELECT * FROM tbl_books ..." );
sql.append( " SET rowcount 0" );
stmt = conn.prepareStatement( sql.toString() );
Cela dépendra de la syntaxe prise en charge par votre base de données. Dans cet exemple, notez le spaces
supplémentaire complétant les instructions afin qu'il y ait un espace blanc entre les staments.