sql >> Database teknologi >  >> RDS >> Mysql

Flere forespørgsler udført i java i en enkelt sætning

Jeg tænkte på, om det er muligt at udføre sådan noget ved hjælp af JDBC.

"SELECT FROM * TABLE;INSERT INTO TABLE;"

Ja det er muligt. Der er to måder, så vidt jeg ved. Det er de

  1. Ved at indstille egenskaben for databaseforbindelse til at tillade flere forespørgsler, adskilt af et semikolon som standard.
  2. Ved at kalde en lagret procedure, der returnerer markører implicit.

Følgende eksempler viser de to ovenstående muligheder.

Eksempel 1 :( For at tillade flere forespørgsler ):

Mens du sender en forbindelsesanmodning, skal du tilføje en forbindelsesegenskab allowMultiQueries=true til databasens url. Dette er yderligere forbindelsesegenskaber til dem, hvis der allerede findes nogle, såsom autoReConnect=true , osv.. Acceptable værdier for allowMultiQueries egenskaben er true , false , yes og no . Enhver anden værdi afvises under kørsel med en SQLException .

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

Medmindre en sådan instruktion er bestået, er en SQLException er smidt.

Du skal bruge execute( String sql ) eller dets andre varianter for at hente resultaterne af forespørgselsudførelsen.

boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );

For at gentage og behandle resultater skal du bruge følgende trin:

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

Eksempel 2 :Trin, der skal følges:

  1. Opret en procedure med en eller flere select og DML forespørgsler.
  2. Kald det fra java ved hjælp af CallableStatement .
  3. Du kan fange flere ResultSet s udført i procedure.
    DML-resultater kan ikke fanges, men kan udstede en anden select
    for at finde ud af, hvordan rækkerne påvirkes i tabellen.

Eksempeltabel og 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)

Opkaldsprocedure fra 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. Fysiske replikationsmekanismer i PostgreSQL

  2. Hvordan forhindrer man BOB i at fortolke et spørgsmålstegn som en pladsholder?

  3. Installer Innotop for at overvåge MySQL-serverydelsen

  4. Inkluder kolonnenavne i SQLite-forespørgselsresultater