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

Oracle के लिए SQLData.writeSQL() के भीतर java.sql.SQLOutput के लिए java.sql.Array कैसे लिखें?

यहाँ मैंने इस मुद्दे को हल करने के लिए क्या किया है। यह सुंदर नहीं है, लेकिन यह काम करता है।

मैंने SQLData implementing को लागू करने वाली अपनी कक्षा में एक विधि जोड़ी है जो एक java.sql.Connection . प्राप्त करता है और संबंधित java.sql.ARRAY . को सेटअप करता है वस्तुओं।

कुछ इस तरह:

public class MyObject01 implements SQLData {
   private String value;
   private MyObject02[] details; // do note that details is a java array
   // ... also added getters and setters for these two properties

   private Array detailsArray;

   public void setupArrays(oracle.jdbc.OracleConnection oconn)
      throws SQLException
   {
       detailsArrays = oconn.createARRAY(MyObject02.ORACLE_OBJECT_ARRAY_NAME, getDetails());
       // MyObject02.ORACLE_OBJECT_ARRAY_NAME must be the name of the oracle "table of" type name
       // Also note that in Oracle you can't use JDBC's default createArray
       // since it's not supported. That's why you need to get a OracleConnection
       // instance here. 
   }       

   @Override
   public void writeSQL(Stream stream) throws SQLException {
       stream.writeString(getValue());
       stream.writeArray(detailsArray); // that's it
   }

   @Override
   public void readSQL(Stream stream) throws SQLException {
       setValue(stream.readString());
       Array array = stream.readArray();
       if (array != null) {
           setDetails((MyObject02[])array.getArray());
       }
   }

वह पहला भाग है।

फिर, किसी प्रक्रिया कॉल में उस ऑब्जेक्ट का उपयोग करने से पहले, setupArrays . का आह्वान करें उस वस्तु पर विधि। उदाहरण:

public class DB {
    public static String executeProc(Connection conn, MyObject01 obj)
        throws SQLException
    {
        CalllableStatement cs = conn.prepareCall(" { ? = call sch.proc(?) }");
        cs.registerOutParameter(1, Types.VARCHAR);
        obj.setupArrays((oracle.jdbc.Connection)conn);
        cs.setObject(2, obj, Types.STRUCT);
        cs.executeUpdate();
        String ret = cs.getString(1);
        cs.close();
        return ret;
    }
}

बेशक, कनेक्शन पर, आपको अपने प्रकारों को ठीक से पंजीकृत करने की आवश्यकता है:

Connection conn = DriverManager.getConnection("jdbc:oracle://localhost:1521/XE", "scott", "tiger" );
conn.getTypeMap().put(MyObject01.ORACLE_OBJECT_NAME, MyObject01.class);
conn.getTypeMap().put(MyObject02.ORACLE_OBJECT_NAME, MyObject02.class);
conn.getTypeMap().put(MyObject02.ORACLE_OBJECT_ARRAY_NAME, MyObject02[].class);

आशा है कि यह मदद करता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle समारोह में पिछले महीने का अंतिम दिन प्राप्त करना

  2. ओरा-01427 सिंगल-पंक्ति सबक्वायरी को कैसे ठीक करें चयन में एक से अधिक पंक्ति लौटाता है?

  3. विजुअल C# 2008 . में tnsnames.ora को पार्स करना

  4. PL/SQL का उपयोग करके तालिका से डेटा पुनर्प्राप्त करना

  5. एसक्यूएल राज्य [99999]; त्रुटि कोड [17004]; अमान्य स्तंभ प्रकार:1111 स्प्रिंग SimpleJdbcCall के साथ