मैं सोच रहा था कि क्या JDBC का उपयोग करके ऐसा कुछ निष्पादित करना संभव है।
"SELECT FROM * TABLE;INSERT INTO TABLE;"
हाँ, ऐसा सम्भव है। जहाँ तक मुझे पता है, दो तरीके हैं। वे हैं
- कई प्रश्नों को अनुमति देने के लिए डेटाबेस कनेक्शन गुण सेट करके, डिफ़ॉल्ट रूप से अर्ध-कोलन द्वारा अलग किया जाता है।
- एक संग्रहित प्रक्रिया को कॉल करके जो कर्सर को निहित रूप से लौटाती है।
निम्नलिखित उदाहरण उपरोक्त दो संभावनाओं को प्रदर्शित करते हैं।
उदाहरण 1 :(एकाधिक प्रश्नों की अनुमति देने के लिए):
कनेक्शन अनुरोध भेजते समय, आपको एक कनेक्शन गुण allowMultiQueries=true
संलग्न करना होगा डेटाबेस यूआरएल के लिए। यह उनके लिए अतिरिक्त कनेक्शन गुण है यदि कुछ पहले से मौजूद हैं, जैसे autoReConnect=true
, आदि.. allowMultiQueries
. के लिए स्वीकार्य मान संपत्ति true
हैं , false
, yes
, और no
. किसी भी अन्य मान को SQLException
. के साथ रनटाइम पर अस्वीकार कर दिया जाता है .
String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";
जब तक ऐसा निर्देश पारित नहीं किया जाता है, एक SQLException
फेंक दिया जाता है।
आपको execute( String sql )
या इसके अन्य प्रकार क्वेरी निष्पादन के परिणाम प्राप्त करने के लिए।
boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );
परिणामों को पुनरावृत्त करने और संसाधित करने के लिए आपको निम्नलिखित चरणों की आवश्यकता है:
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
उदाहरण 2 :अनुसरण करने के लिए कदम:
- एक या अधिक के साथ एक प्रक्रिया बनाएं
select
, औरDML
प्रश्न. - इसे जावा से
CallableStatement
का उपयोग करके कॉल करें । - आप एकाधिक
ResultSet
कैप्चर कर सकते हैं प्रक्रिया में निष्पादित किया गया है।
DML परिणाम कैप्चर नहीं किए जा सकते हैं, लेकिन एक औरselect
जारी कर सकते हैं
यह पता लगाने के लिए कि तालिका में पंक्तियाँ कैसे प्रभावित होती हैं।
नमूना तालिका और प्रक्रिया :
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)
जावा से कॉल प्रक्रिया :
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