Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Mehrere Abfragen, die in Java in einer einzigen Anweisung ausgeführt werden

Ich habe mich gefragt, ob es möglich ist, so etwas mit JDBC auszuführen.

"SELECT FROM * TABLE;INSERT INTO TABLE;"

Ja, es ist möglich. Es gibt zwei Möglichkeiten, soweit ich weiß. Sie sind

  1. Indem Sie die Datenbankverbindungseigenschaft so einstellen, dass mehrere Abfragen zulässig sind, die standardmäßig durch ein Semikolon getrennt werden.
  2. Durch Aufrufen einer gespeicherten Prozedur, die Cursor implizit zurückgibt.

Die folgenden Beispiele demonstrieren die beiden oben genannten Möglichkeiten.

Beispiel 1 :(Um mehrere Abfragen zuzulassen):

Beim Senden einer Verbindungsanfrage müssen Sie eine Verbindungseigenschaft allowMultiQueries=true anhängen zur Datenbank-URL. Dies ist eine zusätzliche Verbindungseigenschaft zu denen, falls bereits welche vorhanden sind, wie autoReConnect=true , etc.. Zulässige Werte für allowMultiQueries -Eigenschaft sind true , false , yes , und no . Jeder andere Wert wird zur Laufzeit mit einer SQLException abgewiesen .

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

Wenn eine solche Anweisung nicht übergeben wird, eine SQLException wird geworfen.

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

boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );

Um Ergebnisse zu durchlaufen und zu verarbeiten, sind folgende Schritte erforderlich:

READING_QUERY_RESULTS: // label  
    while ( hasMoreResultSets || stmt.getUpdateCount() != -1 ) {  
        if ( hasMoreResultSets ) {  
            Resultset rs = stmt.getResultSet();
            // handle your rs here
        } // if has rs
        else { // if ddl/dml/...
            int queryResult = stmt.getUpdateCount();  
            if ( queryResult == -1 ) { // no more queries processed  
                break READING_QUERY_RESULTS;  
            } // no more queries processed  
            // handle success, failure, generated keys, etc here
        } // if ddl/dml/...

        // check to continue in the loop  
        hasMoreResultSets = stmt.getMoreResults();  
    } // while results

Beispiel 2 :Zu befolgende Schritte:

  1. Erstellen Sie eine Prozedur mit einem oder mehreren select und DML Abfragen.
  2. Rufen Sie es von Java aus mit CallableStatement auf .
  3. Sie können mehrere ResultSet erfassen s wird in der Prozedur ausgeführt.
    DML-Ergebnisse können nicht erfasst werden, können aber einen weiteren select ausgeben
    um herauszufinden, wie die Zeilen in der Tabelle betroffen sind.

Beispieltabelle und Verfahren :

mysql> create table tbl_mq( i int not null auto_increment, name varchar(10), primary key (i) );
Query OK, 0 rows affected (0.16 sec)

mysql> delimiter //
mysql> create procedure multi_query()
    -> begin
    ->  select count(*) as name_count from tbl_mq;
    ->  insert into tbl_mq( names ) values ( 'ravi' );
    ->  select last_insert_id();
    ->  select * from tbl_mq;
    -> end;
    -> //
Query OK, 0 rows affected (0.02 sec)
mysql> delimiter ;
mysql> call multi_query();
+------------+
| name_count |
+------------+
|          0 |
+------------+
1 row in set (0.00 sec)

+------------------+
| last_insert_id() |
+------------------+
|                3 |
+------------------+
1 row in set (0.00 sec)

+---+------+
| i | name |
+---+------+
| 1 | ravi |
+---+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Prozedur von Java aufrufen :

CallableStatement cstmt = con.prepareCall( "call multi_query()" );  
boolean hasMoreResultSets = cstmt.execute();  
READING_QUERY_RESULTS:  
    while ( hasMoreResultSets ) {  
        Resultset rs = stmt.getResultSet();
        // handle your rs here
    } // while has more rs