web-dev-qa-db-fra.com

Comment exécuter plusieurs instructions SQL à partir de java

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.

27
happy

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.

  • Les pilotes JDBC ne sont pas requis pour prendre en charge cette fonctionnalité. Vous devez utiliser la méthode 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é.
  • La méthode addBatch () de Statement, PreparedStatement et CallableStatement est utilisée pour ajouter des instructions individuelles au lot. La fonction executeBatch() est utilisée pour démarrer l'exécution de toutes les instructions regroupées.
  • Le executeBatch () renvoie un tableau d'entiers, et chaque élément du tableau représente le nombre de mises à jour pour l'instruction de mise à jour respective .
  • Tout comme vous pouvez ajouter des instructions à un lot pour traitement, vous pouvez les supprimer avec la méthode clearBatch () . Cette méthode supprime toutes les instructions que vous avez ajoutées avec la méthode 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

37
Hemant Metalia

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 ResultSets. 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.

4
Brad