একক বিবৃতিতে জাভাতে একাধিক প্রশ্ন কার্যকর করা হয়


101

হাই আমি ভাবছিলাম যে জেডিবিসি ব্যবহার করে এরকম কিছু কার্যকর করা সম্ভব কিনা কারণ এটি বর্তমানে মাইএসকিউএল ক্যোয়ার ব্রাউজারে সম্ভব হলেও এটি একটি ব্যতিক্রম সরবরাহ করে provides

"SELECT FROM * TABLE;INSERT INTO TABLE;"

যদিও আমি বুঝতে পারি যে এসকিউএল কোয়েরি স্ট্রিংটি বিভক্ত হওয়া এবং বিবৃতিতে দু'বার মৃত্যুদণ্ড কার্যকর করা সম্ভব তবে এর জন্য যদি ওয়ান টাইম পদ্ধতির উপস্থিতি হয় তবে আমি ভাবছিলাম।

    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);

4
সঞ্চিত পদ্ধতিতে রাখুন, সঞ্চিত পদ্ধতিতে কল করুন। মানে আপনি যখন পরিবর্তন করতে চান তখন আপনার কোডটি পুনরায় প্রকাশ করতে হবে না।
ক্রিস

5
সংযোগ স্ট্রিংয়ে আপনাকে সেট করতে হবে এমন একটি সম্পত্তি আছে allowMultiQueries=true
রাহুল

? সম্ভাব্য সদৃশ: কিভাবে জাভা যৌগিক SQL কোয়্যারিগুলোকে চালানো [1] [1]: stackoverflow.com/questions/6773393/...
prayagupd

4
হাই রাহুল, এই প্রকল্পের জন্য আমি একটি সরল পুরানো সংযোগ অবজেক্টটি ব্যবহার করছি এবং আপনি কি জানেন যে আমার "অনুমতি মাল্টিওকুইরিজ = সত্য" সেট করা উচিত। প্রশ্নে সংযোগ অবজেক্ট কোড যুক্ত করেছেন
মিলিন্দা

উত্তর:


142

আমি ভাবছিলাম যে জেডিবিসি ব্যবহার করে এরকম কিছু কার্যকর করা সম্ভব কিনা।

"SELECT FROM * TABLE;INSERT INTO TABLE;"

হ্যা এটা সম্ভব. আমি জানি যতদূর দুটি উপায় আছে। তারা হয়

  1. ডিফল্টরূপে একটি আধা-কোলন দ্বারা পৃথক পৃথক একাধিক প্রশ্নের অনুমতি দিতে ডাটাবেস সংযোগের বৈশিষ্ট্য সেট করে।
  2. সঞ্চিত পদ্ধতিতে কল করে যা কার্সারকে অন্তর্ভুক্ত করে দেয়।

নিম্নলিখিত উদাহরণগুলি উপরের দুটি সম্ভাব্যতা প্রদর্শন করে।

উদাহরণ 1 : (একাধিক প্রশ্নের অনুমতি দিতে):

কোনও সংযোগের অনুরোধ প্রেরণের সময়, আপনাকে একটি সংযোগের বৈশিষ্ট্যটি allowMultiQueries=trueডাটাবেস url এ সংযুক্ত করতে হবে। এই সেই অতিরিক্ত সংযোগ সম্পত্তি যদি আগে থেকেই আছে কিছু, মত হল 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

দুর্ভাগ্যক্রমে, এটি ডার্বির এম্বেড করা সংস্করণটির সাথে কাজ করে না।
ব্যবহারকারী 2428118

@ ইউজার 2428118: কারণ? কোন ত্রুটি লক্ষ্য করা যায়? ড্রাইভার কি এই বৈশিষ্ট্যটি সমর্থন করে কিনা তা আপনি পরীক্ষা করেছেন?
রবীন্দ্র রেড্ডি

আমি allowMultiQueries যুক্ত করেছেন = সত্য এবং কাজ করে জরিমানা :)
Hazim

আপনাকে @ রবীন্দ্ররেডি ধন্যবাদ
সিভা আর

34

আপনি ব্যাচ আপডেট ব্যবহার করতে পারেন তবে ক্যোয়ারীগুলি অবশ্যই ক্রিয়াকলাপ (যেমন সন্নিবেশ করান, আপডেট করুন এবং মুছুন) কোয়েরি হতে হবে

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();

4
আপনি "কল স্প্রোকনাম ('abc', 984)" প্রশ্নের জন্য এই পদ্ধতির ব্যবহার করতে পারবেন না?
sebnukem

19

ইঙ্গিত: আপনার যদি একাধিক সংযোগের সম্পত্তি থাকে তবে তাদের সাথে আলাদা করুন:

&

আপনাকে এমন কিছু দেওয়ার জন্য:

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

আমি আশা করি এটা কারো সাহায্যে লাগবে.

শুভেচ্ছা,

গ্লিন


11

আমার পরীক্ষার উপর ভিত্তি করে, সঠিক পতাকাটি হ'ল "অনুমতি মাল্টিওকুইরিজ = সত্য"


2

আপনি এর জন্য কেন চেষ্টা এবং লেখেন না Stored Procedure?

আপনি যা চান তা করতে পারেন Result Setএবং একই সাথে Stored Procedureআপনি Insertযা করতে চান তা করতে পারেন।

কেবলমাত্র Result Setযদি আপনি Insertপরে সন্নিবেশ করা সারিগুলি না পান তবে আপনি সম্ভবত এটি পেতে পারেন Select


4
আপনার কাছে সর্বদা কোনও সঞ্চিত প্রক্রিয়া লেখার অনুমতি নেই। উদাহরণস্বরূপ এটি কোনও ক্লায়েন্টের ডাটাবেস যা আপনাকে কেবলমাত্র চয়ন করার অনুমতি পেয়েছে।
পেডরাম বাশিরি

2

আমি মনে করি এটি বহুগুণ নির্বাচন / আপডেট / সন্নিবেশ / মোছার পক্ষে সহজতম উপায়। এক্সিকিউটিউপডেট (টিআরটি) দিয়ে আপনি নির্বাচিত হওয়ার পরে যতগুলি আপডেট / সন্নিবেশ / মুছতে চান তেমন চালাতে পারেন (এক্সিকিউটিউপডেট (টিআরটি) দিয়ে আপনাকে প্রথমে একটি সিলেক্ট করতে হবে (প্রয়োজনে একটি ডামি)) (কেবল নতুন ইনট ব্যবহার করুন (কাউন্ট 1, কাউন্ট 2, ...)) এবং যদি আপনার একটি নতুন নির্বাচন 'স্টেটমেন্ট' এবং 'সংযোগ' বন্ধ করে প্রয়োজন হয় এবং পরবর্তী নির্বাচনের জন্য নতুন করুন। উদাহরণস্বরূপ:

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);
    }

আমি আসা করি এটা সাহায্য করবে


4
একটি ডিবি সংযোগ খোলা খুব ব্যয়বহুল। প্রতিবার যে ভাল অনুশীলন না। আপনি যেটি দিয়েছিলেন তাতে এন সংখ্যা ডাব্লু হিট করা উচিত এন ক্যোয়ারীর সংখ্যা সংখ্যা যা খারাপ পারফরম্যান্সের দিকে নিয়ে যায়।
অরুণ কুমার মুদ্রাবোয়িনা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.