यह संभव नहीं है, टेबल्स द्वारा पीएल/एसक्यूएल इंडेक्स एक्सेस करना देखें:
<ब्लॉकक्वॉट>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 स्टेटमेंट में तैयार स्टेटमेंट के रूप में उपयोग कर सकते हैं…