sql >> Databasteknik >  >> RDS >> Mysql

Flera frågor körs i java i en enda sats

Jag undrade om det är möjligt att utföra något liknande med JDBC.

"SELECT FROM * TABLE;INSERT INTO TABLE;"

Ja det är möjligt. Det finns två sätt, så vitt jag vet. De är

  1. Genom att ställa in databasanslutningsegenskapen för att tillåta flera frågor, separerade med semikolon som standard.
  2. Genom att anropa en lagrad procedur som returnerar markörer implicit.

Följande exempel visar ovanstående två möjligheter.

Exempel 1 :( För att tillåta flera frågor ):

När du skickar en anslutningsförfrågan måste du lägga till en anslutningsegenskap allowMultiQueries=true till databasens url. Detta är en ytterligare anslutningsegenskap till de som redan finns, som autoReConnect=true , etc.. Godkända värden för allowMultiQueries egenskapen är true , false , yes och no . Alla andra värden avvisas vid körning med en SQLException .

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

Om inte en sådan instruktion godkänns, en SQLException kastas.

Du måste använda execute( String sql ) eller dess andra varianter för att hämta resultat av frågekörningen.

boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );

För att iterera igenom och bearbeta resultat behöver du följande steg:

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

Exempel 2 :Steg att följa:

  1. Skapa en procedur med en eller flera select och DML frågor.
  2. Anrop det från Java med CallableStatement .
  3. Du kan fånga flera ResultSet s körs i procedur.
    DML-resultat kan inte fångas men kan utfärda en annan select
    för att se hur raderna påverkas i tabellen.

Exempeltabell och procedur :

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)

Samtalsprocedur från 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. MAX vs Top 1 - vilket är bättre?

  2. Varför bara väntastatistik inte räcker

  3. Skapa en postgresql DB med psycopg2

  4. Sammanfoga och gruppera flera rader i Oracle