Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Nhiều truy vấn được thực thi trong java trong một câu lệnh

Tôi đã tự hỏi liệu có thể thực thi điều gì đó như thế này bằng JDBC hay không.

"SELECT FROM * TABLE;INSERT INTO TABLE;"

Có nó là có thể. Có hai cách, theo như tôi biết. Họ là

  1. Bằng cách đặt thuộc tính kết nối cơ sở dữ liệu để cho phép nhiều truy vấn, được phân tách bằng dấu chấm phẩy theo mặc định.
  2. Bằng cách gọi một thủ tục được lưu trữ trả về ẩn con trỏ.

Các ví dụ sau đây chứng minh hai khả năng trên.

Ví dụ 1 :(Để cho phép nhiều truy vấn):

Trong khi gửi yêu cầu kết nối, bạn cần phải thêm thuộc tính kết nối allowMultiQueries=true vào url cơ sở dữ liệu. Đây là thuộc tính kết nối bổ sung cho những thuộc tính nếu đã tồn tại một số, như autoReConnect=true , v.v. Các giá trị được chấp nhận cho allowMultiQueries thuộc tính true , false , yesno . Bất kỳ giá trị nào khác đều bị từ chối trong thời gian chạy với SQLException .

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

Trừ khi hướng dẫn đó được thông qua, SQLException được ném.

Bạn phải sử dụng execute( String sql ) hoặc các biến thể khác của nó để tìm nạp kết quả của việc thực thi truy vấn.

boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );

Để lặp lại và xử lý kết quả, bạn yêu cầu các bước sau:

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

Ví dụ 2 :Các bước thực hiện:

  1. Tạo một thủ tục với một hoặc nhiều selectDML truy vấn.
  2. Gọi nó từ java bằng CallableStatement .
  3. Bạn có thể chụp nhiều ResultSet được thực thi trong thủ tục.
    Không thể thu thập kết quả DML nhưng có thể đưa ra một select khác
    để tìm cách các hàng bị ảnh hưởng trong bảng.

Bảng mẫu và quy trình :

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)

Quy trình gọi từ 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TIME_FORMAT () Ví dụ - MySQL

  2. Làm thế nào để chuyển đổi epoch sang mySQL timestamp trong JAVA

  3. Cú pháp CƠ SỞ DỮ LIỆU SQL DROP - Được DBMS liệt kê

  4. Khắc phục “ERROR 3942 (HY000):Mỗi hàng của mệnh đề VALUES phải có ít nhất một cột” khi sử dụng Câu lệnh VALUES trong MySQL

  5. Cách tính số người dùng hoạt động hàng ngày (DAU) trong MySQL