Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एकल कथन में जावा में निष्पादित एकाधिक प्रश्न

मैं सोच रहा था कि क्या JDBC का उपयोग करके ऐसा कुछ निष्पादित करना संभव है।

"SELECT FROM * TABLE;INSERT INTO TABLE;"

हाँ, ऐसा सम्भव है। जहाँ तक मुझे पता है, दो तरीके हैं। वे हैं

  1. कई प्रश्नों को अनुमति देने के लिए डेटाबेस कनेक्शन गुण सेट करके, डिफ़ॉल्ट रूप से अर्ध-कोलन द्वारा अलग किया जाता है।
  2. एक संग्रहित प्रक्रिया को कॉल करके जो कर्सर को निहित रूप से लौटाती है।

निम्नलिखित उदाहरण उपरोक्त दो संभावनाओं को प्रदर्शित करते हैं।

उदाहरण 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 :अनुसरण करने के लिए कदम:

  1. एक या अधिक के साथ एक प्रक्रिया बनाएं select , और DML प्रश्न.
  2. इसे जावा से CallableStatement का उपयोग करके कॉल करें ।
  3. आप एकाधिक 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL में टेक्स्ट फ़ील्ड से लगातार दो अंक कैसे निकालें?

  2. MySQL 8 कॉमन टेबल एक्सप्रेशंस CTE

  3. MySQL तालिका में varchar लंबाई का महत्व

  4. MySQL / MariaDB डेटाबेस के ऑटो इंक्रीमेंट वैल्यू को कैसे बदलें

  5. कोई कनेक्शन नहीं बनाया जा सका क्योंकि लक्ष्य मशीन ने सक्रिय रूप से इसे अस्वीकार कर दिया (PHP/WAMP)