Saya bertanya-tanya apakah mungkin untuk mengeksekusi sesuatu seperti ini menggunakan JDBC.
"SELECT FROM * TABLE;INSERT INTO TABLE;"
Ya itu mungkin. Ada dua cara, sejauh yang saya tahu. Mereka
- Dengan mengatur properti koneksi database untuk memperbolehkan beberapa kueri, dipisahkan oleh titik koma secara default.
- Dengan memanggil prosedur tersimpan yang mengembalikan kursor secara implisit.
Contoh berikut menunjukkan dua kemungkinan di atas.
Contoh 1 : (Untuk mengizinkan banyak kueri):
Saat mengirim permintaan koneksi, Anda perlu menambahkan properti koneksi allowMultiQueries=true
ke url database. Ini adalah properti koneksi tambahan untuk mereka jika sudah ada beberapa, seperti autoReConnect=true
, dll .. nilai yang dapat diterima untuk allowMultiQueries
properti yang true
, false
, yes
, dan no
. Nilai lain apa pun ditolak pada waktu proses dengan SQLException
.
String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";
Kecuali instruksi seperti itu diberikan, an SQLException
dilempar.
Anda harus menggunakan execute( String sql )
atau varian lainnya untuk mengambil hasil eksekusi kueri.
boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );
Untuk mengulangi dan memproses hasil, Anda memerlukan langkah-langkah berikut:
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
Contoh 2 : Langkah-langkah untuk diikuti:
- Buat prosedur dengan satu atau lebih
select
, dan DML
kueri.
- Sebut saja dari java menggunakan
CallableStatement
.
- Anda dapat menangkap beberapa gambar yang
ResultSet
dieksekusi dalam prosedur.
Hasil DML tidak dapat ditangkap tetapi dapat mengeluarkan hasil lain select
untuk menemukan bagaimana baris terpengaruh dalam tabel.
Tabel sampel dan prosedur :
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)
Prosedur Panggilan dari 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