Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wiele zapytań wykonywanych w java w jednej instrukcji

Zastanawiałem się, czy możliwe jest wykonanie czegoś takiego za pomocą JDBC.

"SELECT FROM * TABLE;INSERT INTO TABLE;"

Tak to mozliwe. O ile wiem, istnieją dwa sposoby. Są

  1. Ustawiając właściwość połączenia z bazą danych, aby umożliwić wiele zapytań, domyślnie oddzielonych średnikiem.
  2. Poprzez wywołanie procedury składowanej, która niejawnie zwraca kursory.

Poniższe przykłady pokazują dwie powyższe możliwości.

Przykład 1 :( Aby zezwolić na wiele zapytań ):

Podczas wysyłania żądania połączenia musisz dołączyć właściwość połączenia allowMultiQueries=true do adresu URL bazy danych. Jest to dodatkowa właściwość połączenia do tych, jeśli już istnieją, takich jak autoReConnect=true itp. Dopuszczalne wartości dla allowMultiQueries właściwość jest true , false , yes i no . Każda inna wartość jest odrzucana w czasie wykonywania z SQLException .

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

O ile taka instrukcja nie zostanie przekazana, SQLException jest rzucany.

Musisz użyć execute( String sql ) lub jego inne warianty, aby pobrać wyniki wykonania zapytania.

boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );

Aby przejść i przetworzyć wyniki, należy wykonać następujące czynności:

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

Przykład 2 :Kolejne kroki:

  1. Utwórz procedurę z co najmniej jednym select i DML zapytania.
  2. Wywołaj go z Javy za pomocą CallableStatement .
  3. Możesz przechwycić wiele ResultSet są wykonywane w procedurze.
    Wyniki DML nie mogą zostać przechwycone, ale mogą wydać kolejny select
    aby dowiedzieć się, jak wpływa to na wiersze w tabeli.

Przykładowa tabela i procedura :

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)

Procedura wywołania z Javy :

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy mysql_real_escape_string() W PEŁNI chroni przed wstrzyknięciem SQL?

  2. MySQL InnoDB Cluster 8.0 — pełny opis operacji:część druga

  3. Jak sprawdzić, czy kolumna jest pusta lub null w MySQL?

  4. Przeszukuj wszystkie kolumny tabeli, używając pojedynczego warunku WHERE z jednym słowem kluczowym w mysql

  5. Tworzenie wysoce dostępnej bazy danych dla Moodle przy użyciu replikacji MySQL