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


हाय मैं सोच रहा था कि जेडीबीसी का उपयोग करके ऐसा कुछ निष्पादित करना संभव है क्योंकि यह वर्तमान में अपवाद प्रदान करता है भले ही यह MySQL क्वेरी ब्राउज़र में संभव हो।

"SELECT FROM * TABLE;INSERT INTO TABLE;"

जबकि मुझे एहसास है कि SQL क्वेरी स्ट्रिंग को विभाजित करने के साथ संभव है और कथन दो बार निष्पादित किया गया है लेकिन मैं सोच रहा था कि इसके लिए एक बार दृष्टिकोण है या नहीं।

    String url = "jdbc:mysql://localhost:3306/";
    String dbName = "databaseinjection";
    String driver = "com.mysql.jdbc.Driver";
    String sqlUsername = "root"; 
    String sqlPassword = "abc";

    Class.forName(driver).newInstance();

    connection = DriverManager.getConnection(url+dbName, sqlUsername, sqlPassword);

76
2018-05-29 10:58


मूल


संग्रहीत प्रक्रिया में डाल दिया, संग्रहीत प्रक्रिया को कॉल करें। इसका मतलब है कि जब आप कोई परिवर्तन करना चाहते हैं तो आपको अपने कोड को फिर से तैनात नहीं करना पड़ेगा। - Chris
एक ऐसी संपत्ति है जिसे आपको कनेक्शन स्ट्रिंग में सेट करना है allowMultiQueries=true। - Rahul
संभावित डुप्लिकेट: जावा में समग्र एसक्यूएल प्रश्न कैसे निष्पादित करें? [1] [1]: stackoverflow.com/questions/6773393/... - prayagupd
हाय राहुल, इस परियोजना के लिए मैं एक सादे पुराने कनेक्शन ऑब्जेक्ट का उपयोग कर रहा हूं और क्या आपको पता है कि मुझे "allowMultiQueries = true" कहां सेट करना चाहिए। प्रश्न में कनेक्शन ऑब्जेक्ट कोड जोड़ा है - MilindaD


जवाब:


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

"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प्रक्रिया में निष्पादित।
    डीएमएल परिणामों पर कब्जा नहीं किया जा सकता है लेकिन एक और जारी कर सकते हैं 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

108
2018-05-29 18:33



दुर्भाग्य से, यह डर्बी के एम्बेडेड संस्करण के साथ काम नहीं करता है। - user2428118
@ user2428118: कारण? कोई त्रुटि देखी गई? क्या आपने जांच की है कि ड्राइवर इस सुविधा का समर्थन करता है या नहीं? - Ravinder Reddy
मैंने allowMultiQueries = true जोड़ा है और ठीक काम करता है :) - Hazim
धन्यवाद @RavinderReddy - shiva R


आप बैच अपडेट का उपयोग कर सकते हैं लेकिन प्रश्नों को कार्रवाई (यानी सम्मिलित, अद्यतन और हटाएं) प्रश्न होना चाहिए

Statement s = c.createStatement();
String s1 = "update emp set name='abc' where salary=984";
String s2 = "insert into emp values ('Osama',1420)";  
s.addBatch(s1);
s.addBatch(s2);     
s.executeBatch();

22
2018-05-29 11:46



आप "कॉल स्पोकनाम ('एबीसी', 984)" प्रश्नों के लिए इस दृष्टिकोण का उपयोग नहीं कर सकते हैं? - sebnukem


संकेत: यदि आपके पास एक से अधिक कनेक्शन संपत्ति हैं तो उन्हें अलग करें:

&

आपको कुछ देने के लिए:

url="jdbc:mysql://localhost/glyndwr?autoReconnect=true&allowMultiQueries=true"

मुझे उम्मीद है इससे किसी को सहायता मिलेगी।

सादर,

ग्लिन


12
2018-01-25 23:30





मेरे परीक्षण के आधार पर, सही ध्वज "allowMultiQueries = true" है


7
2017-11-08 07:18





आप कोशिश क्यों नहीं करते और लिखते हैं Stored Procedure इसके लिए?

आप प्राप्त कर सकते हैं Result Set बाहर और उसी में Stored Procedure आप ऐसा कर सकते हैं Insert आपको क्या चाहिए।

एकमात्र चीज यह है कि आपको नई डाली गई पंक्तियां नहीं मिल सकती हैं Result Set अगर तुम Insert के बाद Select


0
2018-05-29 11:04





मुझे लगता है कि यह बहु चयन / अद्यतन / सम्मिलित / हटाने के लिए सबसे आसान तरीका है। आप चयन के बाद जितना चाहें उतने अपडेट / डालने / हटा सकते हैं (निष्पादित करने के बाद आपको पहले चयन करना होगा (यदि आवश्यक हो तो एक डमी)) अद्यतन (str) (केवल नए int (count1, count2, ...) का उपयोग करें) और यदि आपको एक नए चयन को 'कथन' और 'कनेक्शन' बंद करने की आवश्यकता है और अगले चयन के लिए नया बनाएं। उदाहरण की तरह:

String str1 = "select * from users";
String str9 = "INSERT INTO `port`(device_id, potition, port_type, di_p_pt) VALUE ('"+value1+"', '"+value2+"', '"+value3+"', '"+value4+"')";
String str2 = "Select port_id from port where device_id = '"+value1+"' and potition = '"+value2+"' and port_type = '"+value3+"' ";
try{  
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    theConnection=(Connection) DriverManager.getConnection(dbURL,dbuser,dbpassword);  
    theStatement = theConnection.prepareStatement(str1);
    ResultSet theResult = theStatement.executeQuery();
    int count8 = theStatement.executeUpdate(str9);
    theStatement.close();
    theConnection.close();
    theConnection=DriverManager.getConnection(dbURL,dbuser,dbpassword);
    theStatement = theConnection.prepareStatement(str2);
    theResult = theStatement.executeQuery();

    ArrayList<Port> portList = new ArrayList<Port>();
    while (theResult.next()) {
        Port port = new Port();
        port.setPort_id(theResult.getInt("port_id"));

        portList.add(port);
    }

मुझे उम्मीद है यह मदद करेगा


-1
2018-06-28 10:28



एक डीबी कनेक्शन खोलना बहुत महंगा है। हर बार ऐसा करने का अच्छा अभ्यास नहीं है। जो आपने दिया है उसे संख्याओं की संख्या के लिए एन संख्या डीबी हिट बनाना चाहिए जिससे खराब प्रदर्शन होता है। - Arun Kumar Mudraboyina