sql >> Database >  >> RDS >> Mysql

Meerdere query's uitgevoerd in Java in één instructie

Ik vroeg me af of het mogelijk is om zoiets uit te voeren met JDBC.

"SELECT FROM * TABLE;INSERT INTO TABLE;"

Ja, het is mogelijk. Er zijn twee manieren, voor zover ik weet. Ze zijn

  1. Door de databaseverbindingseigenschap in te stellen om meerdere zoekopdrachten toe te staan, standaard gescheiden door een puntkomma.
  2. Door een opgeslagen procedure aan te roepen die cursors impliciet retourneert.

De volgende voorbeelden demonstreren de bovenstaande twee mogelijkheden.

Voorbeeld 1 :(Om meerdere zoekopdrachten toe te staan):

Tijdens het verzenden van een verbindingsverzoek moet u een verbindingseigenschap allowMultiQueries=true toevoegen naar de database-URL. Dit is een extra verbindingseigenschap voor degenen die al bestaan, zoals autoReConnect=true , enz.. Aanvaardbare waarden voor allowMultiQueries eigenschap zijn true , false , yes , en no . Elke andere waarde wordt tijdens runtime afgewezen met een SQLException .

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

Tenzij een dergelijke instructie wordt doorgegeven, wordt een SQLException wordt gegooid.

Je moet execute( String sql ) of de andere varianten om resultaten van de uitvoering van de query op te halen.

boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );

Om de resultaten te doorlopen en te verwerken, hebt u de volgende stappen nodig:

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

Voorbeeld 2 :Te volgen stappen:

  1. Maak een procedure met een of meer select , en DML vragen.
  2. Bel het vanuit Java met CallableStatement .
  3. U kunt meerdere ResultSet capture vastleggen s uitgevoerd in procedure.
    DML-resultaten kunnen niet worden vastgelegd, maar kunnen een andere select geven
    om te zien hoe de rijen in de tabel worden beïnvloed.

Voorbeeldtabel en procedure :

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)

Bel Procedure vanuit Java :

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


  1. Equivalent van Oracle's RowID in MySQL

  2. Entity Developer en ADO.Net Data Providers ondersteunen nu Entity Framework Core 5

  3. SQL WHERE-component die overeenkomt met waarden met volgspaties

  4. Is er een prestatiehit met behulp van decimale gegevenstypen (MySQL / Postgres)