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à
- 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.
- 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
, yes
và no
. 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:
- Tạo một thủ tục với một hoặc nhiều
select
vàDML
truy vấn. - Gọi nó từ java bằng
CallableStatement
. - 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ộtselect
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