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

जावा वर्ग से तालिका प्रकार के रूप में आउट पैरामीटर के साथ प्रक्रिया को कैसे कॉल करें

यह संभव नहीं है, टेबल्स द्वारा पीएल/एसक्यूएल इंडेक्स एक्सेस करना देखें:

<ब्लॉकक्वॉट>

Oracle JDBC तत्व प्रकारों के रूप में RAW, DATE और PL/SQL RECORD का समर्थन नहीं करता है।

मैं शायद इस तरह एक कस्टम (वैश्विक, पैकेज नहीं) ऑब्जेक्ट प्रकार का उपयोग करूंगा:

CREATE TYPE t_all_record AS OBJECT (
  x_object_type_id        number,
    x_object_name           varchar2(100),
    x_object_id             varchar2(70),
    x_audit_timestamp       timestamp(6),
    x_payload               clob
)
/
CREATE TYPE t_all_records IS TABLE OF t_all_record
/

अपने पैकेज में प्रकार की तालिका का संदर्भ लें (tt_all_tab के बजाय t_all_records) और इसे इस तरह भरें

procedure get_data_Q1(x_object_id in varchar2 , x_all_type out t_all_records )
AS
begin
    SELECT t_all_record(O.object_type_id,O.object_name,O.object_id,A.audit_timestamp,P.payload)
    BULK COLLECT INTO x_all_type
    FROM APPLICATION APP, EXCEPTIONS E,MASTER_AUDIT A,MODULE_TYPE M,OBJECT_TYPE O,PAYLOAD P 
    WHERE ( A.MODULE_TYPE_ID = M.MODULE_TYPE_ID ) AND ( M.APPLICATION_ID = APP.APPLICATION_ID ) AND ( A.OBJECT_TYPE_ID = O.OBJECT_TYPE_ID ) AND ( O.OBJECT_ID = x_object_id )
end get_data_Q1;

परिणाम जावा से इस प्रकार उपयोग करने योग्य होगा:

package tests.jdbc;

import java.sql.Array;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSetMetaData;
import java.sql.Struct;
import java.sql.Types;

import oracle.sql.StructDescriptor;

public class OracleTableOfResult {
    public static void main(String...a) throws Exception {
        Class.forName("oracle.jdbc.OracleDriver");
        Connection connection = DriverManager.getConnection("jdbc:oracle:thin:<USER>/<PASS>@<DATABASEHOST>:1521:<SERVICE>");

        final String typeName = "T_ALL_RECORD";
        final String typeTableName = "T_ALL_RECORDS";

        // Get a description of your type (Oracle specific)
        final StructDescriptor structDescriptor = StructDescriptor.createDescriptor(typeName.toUpperCase(), connection);        
        final ResultSetMetaData metaData = structDescriptor.getMetaData();

        // Call the procedure (or whatever else) that returns the table of a custom type
        CallableStatement cs = connection.prepareCall("{call ult_pkg.get_data_Q1(?, ?)}");
        cs.setString(1, "the_id");
        // Result is an java.sql.Array...
        cs.registerOutParameter(2, Types.ARRAY, typeTableName);     
        cs.execute();

        // ...who's elements are java.sql.Structs
        Object[] data = (Object[]) ((Array) cs.getObject(2)).getArray();
        for(Object tmp : data) {
            Struct row = (Struct) tmp;
            // Attributes are index 1 based...
            int idx = 1;
            for(Object attribute : row.getAttributes()) {               
                System.out.println(metaData.getColumnName(idx) + " = " + attribute);                                            
                ++idx;
            }
            System.out.println("---");
        }
        cs.close();     
        connection.close();
    }
}

लेकिन अंत में, यह संदेहास्पद है कि क्या यह प्रयास के लायक है जब आप अपनी क्वेरी को एक सादे sql स्टेटमेंट में तैयार स्टेटमेंट के रूप में उपयोग कर सकते हैं…




  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 में 10 मिनट के भीतर 10 मिलियन प्रश्नों का INSERT?

  2. Oracle में REGEXP_SUBSTR () फ़ंक्शन

  3. 4 पीएल/एसक्यूएल बेनामी ब्लॉक उदाहरण

  4. Oracle डेटाबेस में फाइल कैसे डालें?

  5. Oracle में दूसरा सबसे न्यूनतम मान चुनें