2011-12-14 11 views
8

This पोस्ट के लिए काम नहीं कर रहा है, उन्होंने एक जेडीबीसी आमंत्रण (SQL सर्वर डेटाबेस के विरुद्ध) में सेमिकोलन से अलग करके कई प्रश्नों को निष्पादित किया है। जब मैं Oracle 10g के साथ भी ऐसा ही करने की कोशिश की, एक त्रुटि "अमान्य वर्ण" ऊपर propped:जेडीबीसी: एकल डेटाबेस आमंत्रण के माध्यम से एकाधिक परिणाम सेट लौटा रहा है - ओरेकल

class db 
{ 
    public static void main(String aa[])throws Exception 
    { 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 
     Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@//192.168.10.29:1521/ttt","username","password"); 
     PreparedStatement stat = conn.prepareStatement("select voila from app where rownum<4; select code from process where rownum<4"); 
     stat.execute(); 
     while (stat.getMoreResults()){ 
      ResultSet rs = stat.getResultSet(); 
      while (rs.next()){ 
       System.out.println(rs.getString(1));   
      } 
     } 
     conn.close(); 
    } 
} 

क्या मैं गलत कर रहा हूँ?

उत्तर

7

तुम गलत

ओरेकल (और इसके JDBC ड्राइवर) (ग्रहण करने के लिए है कि सभी डीबीएमएस एक ही काम को छोड़कर) कुछ भी नहीं कर रहे हैं बस इस का समर्थन नहीं करता।

आपको प्रत्येक चयन को व्यक्तिगत रूप से चलाने की आवश्यकता है।

बीटीडब्ल्यू: यह एक कारण है कि कुछ एसक्यूएल इंजेक्शन हमले ओरेस के साथ काम नहीं करते हैं - विशेष रूप से प्रसिद्ध "little bobby tables" कार्टून।

+0

धन्यवाद। लेकिन क्या ऐसा कोई तरीका है कि मुझे 2 अलग डीबी कॉल करने की ज़रूरत नहीं है? – Daud

+1

यदि दोनों एक ही प्रकार का भुगतान करते हैं तो आप संघ का उपयोग कर सकते हैं। लेकिन यह वास्तविक बीएडी अभ्यास है –

+1

@ डॉउड: नहीं, आपको दो कॉल की आवश्यकता है। –

1

ओरेकल से जेडीबीसी में एक ही कॉल में कई परिणाम सेट प्राप्त करना संभव है। ऐसा करने के कुछ तरीके हैं; एक good post at Oracle-Base shows how

मैं जिस तंत्र का उपयोग करता हूं वह एक कॉल करने योग्य कथन में एक अनाम ब्लॉक बनाना है, फिर आउटपुट पैरामीटर के रूप में प्रत्येक परिणाम सेट के लिए SYS_REFCURSOR बांधें।

यहां कुछ कोड है जो बस यही करता है। यह त्रुटि से निपटने के लिए आलसी है, लेकिन यह भर में विचार हो जाता है:

public void getMultiple() throws Exception { 

    // get connection 
    Connection conn = DriverManager.getConnection(TestConfig.JDBC_URL, TestConfig.DB_USERNAME, TestConfig.DB_PASSWORD); 

    // here's the statement; it uses an anonymous block. In that block, 
    // we've declared two SYS_REFCURSOR objects which are opened over our 
    // SELECT statements. Once the statements are opened, we bind the 
    // SYS_REFCURSOR objects so they can be retrieved from JDBC 
    String s = 
      "DECLARE" + 
      " l_rs1 SYS_REFCURSOR; " + 
      " l_rs2 SYS_REFCURSOR; " + 
      "BEGIN "+ 
      " OPEN l_rs1 FOR " + 
      "  SELECT 'Moose' FROM DUAL;" + 
      " OPEN l_rs2 FOR " + 
      "  SELECT 'Squirrel' FROM DUAL; " + 
      " ? := l_rs1;" + 
      " ? := l_rs2;" + 
      "END;"; 

    // prepare the callable statement, registering 
    // the output parameter we want 
    CallableStatement cs = conn.prepareCall(s); 
    cs.registerOutParameter(1, OracleTypes.CURSOR); 
    cs.registerOutParameter(2, OracleTypes.CURSOR); 

    // execute the callable statement 
    cs.execute(); 

    // retrieve the result sets by getting the bound output objects and 
    // casting them to Java ResultSet objects 
    ResultSet rs1 = (ResultSet) cs.getObject(1); 
    ResultSet rs2 = (ResultSet) cs.getObject(2); 

    // advance the first result set and print the string it yields 
    rs1.next(); 
    System.out.printf("Result set 1 has '%s'\n", rs1.getString(1)); 

    // advance the second result set and print the string it yields 
    rs2.next(); 
    System.out.printf("Result set 2 has '%s'\n", rs2.getString(1)); 

    // close everything up 
    rs2.close(); 
    rs1.close(); 
    cs.close(); 
    conn.close(); 
} 

मुझे आशा है कि तुम बाहर में मदद करता है!

संबंधित मुद्दे