[java] Kann ich mehrere mit Semikolon getrennte Abfragen mit MySQL Connector / J ausführen?


Answers

Ich möchte SQL-Abfrage wie folgt ausführen:

statement.execute("select fullName from user where user_id=1; select fullName from user where user_id=2");

Dies ist nur möglich, wenn Sie eine Datenbankverbindungseigenschaft so eingerichtet haben, dass mehrere Abfragen gleichzeitig ausgeführt werden können. Und der Name der Eigenschaft ist allowMultiQueries=true . Diese Eigenschaft muss festgelegt und zusammen mit einer Datenbankverbindungsanforderung an den Server gesendet werden. Die allgemeine Syntax ist wie folgt:

String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";

Dies ist eine zusätzliche Verbindungseigenschaft zu denen, wenn bereits einige vorhanden sind, wie autoReConnect=true usw.

Zulässige Werte für die allowMultiQueries Eigenschaft sind " true , " false , " yes und " no . Jeder andere Wert wird zur Laufzeit mit einer SQLException .

Sie müssen execute( String sql ) oder seine anderen Varianten verwenden, um Ergebnisse der Abfrageausführung abzurufen.

multiQuerySqlString =  "select fullName from user where user_id=1; ";
multiQuerySqlString += "select fullName from user where user_id=2; ";
// you can multiple types of result sets
multiQuerySqlString += "select last_login from user_logs where user_id=1; ";

boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );

Um die Ergebnisse zu durchlaufen und zu bearbeiten, benötigen Sie folgende Schritte:

int rsNumber = 0;
while ( hasMoreResultSets ) {  
    rsNumber += 1;
    Resultset rs = stmt.getResultSet();

    // based on the structure of the result set,
    // you can handle column values.
    if ( rsNumber == 1 ) {
      while( rs.next() ) {
          // handle your rs here
      } // while rs
    } // if rs is 1
    else if ( rsNumber == 2 ) {
      // call a method using this rs.
      processMyResultSet( rs ); // example
    } // if rs is 2
    // ... etc

    // check whether there exist more result sets  
    hasMoreResultSets = stmt.getMoreResults();  
} // while results

Siehe :

  • Mehrere Abfragen, die in Java in einer einzelnen Anweisung ausgeführt werden
    • Eine der ähnlichen Postings auf SO, für die ich eine Antwort gab.
Question

Mein jdbc-Treiber für mysql db hat die Version 5.1.25.

Ich möchte SQL-Abfrage wie folgt ausführen:

statement.execute("select fullName from user where user_id=1; select fullName from user where user_id=2");

Und ich bekomme immer eine Ausnahme:

Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select fullName from user where user_id=2' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4187)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2809)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2758)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:894)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:732)
    at dbViewer.model.UserConnectionManager.retrieveRoutinesNames1(UserConnectionManager.java:622)
    at dbViewer.model.UserConnectionManager.main(UserConnectionManager.java:637)

ABER, wenn ich dieselbe Abfrage (durch Semikolon getrennt) von der Befehlszeile aus ausführen, funktioniert es einwandfrei und gibt zwei Tabellen wie erwartet aus.