Tôi đã tự hỏi liệu có thể thực thi một cái gì đó như thế này bằng cách sử dụng JDBC.
"SELECT FROM * TABLE;INSERT INTO TABLE;"
Có nó là có thể. Có hai cách, theo như tôi biết. họ đang
- 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ề các con trỏ ngầm.
Các ví dụ sau 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 nối thuộc tính kết nối allowMultiQueries=true
vào url cơ sở dữ liệu. Đây là thêm thuộc tính kết nối với những người nếu đã tồn tại một số người, như autoReConnect=true
, vv .. giá trị chấp nhận được đối với allowMultiQueries
tài sản là 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 bằng SQLException
.
String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";
Trừ khi hướng dẫn như vậy được thông qua, an SQLException
sẽ đượ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ó để lấy kết quả 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
các truy vấn.
- Gọi nó từ java bằng cách sử dụng
CallableStatement
.
- Bạn có thể chụp nhiều
ResultSet
s được thực thi trong thủ tục.
Không thể thu select
thập kết quả DML nhưng có thể đưa ra kết quả 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)
Thủ tục cuộc 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