2012-07-23 13 views
6

gelen tablo türü olarak dışarı parametresi prosedürü çağırmak nasıl, herhangi biri lütfen bana yardımcı olabilir. Şimdiden teşekkürler.Ben <em>Java</em> kodundan paketin <code>ult_pkg</code> Bu prosedürü <code>get_data_Q1</code> arayıp koymak out görüntülemek istediğiniz bir java sınıfından

CREATE OR REPLACE PACKAGE ult_pkg 
AS 
TYPE t_all_record is record (
    x_object_type_id  number, 
    x_object_name   varchar2(100), 
    x_object_id    varchar2(70), 
    x_audit_timestamp  timestamp(6), 
    x_payload    clob 
); 

--table type to hold table data after querying 

type tt_all_tab is table of t_all_record index by binary_integer; 

--declaration pocedures 
procedure get_data_Q1(x_object_id in varchar2 , x_all_type out tt_all_tab); 


end ult_pkg; 

/

oluşturabilir veya
--procedure taking 'object_id' as input parameter and gives out table of 't_all_record' type 
procedure get_data_Q1(x_object_id in varchar2 , x_all_type out tt_all_tab) 
AS 

    i number:=0; 
begin 

    for r in 
     ( 
      SELECT 
      O.object_type_id,O.object_name,O.object_id,A.audit_timestamp,P.payload 
      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) 
     ) 
    -- loop to asign the data from cursor 'r' to carasponding table type columns 
     loop 


     x_all_type(i).x_object_type_id:=r.object_type_id; 
     x_all_type(i).x_object_name:=r.object_name; 
     x_all_type(i).x_object_id:=r.object_id; 
     x_all_type(i).x_audit_timestamp:=r.audit_timestamp; 
     x_all_type(i).x_payload:=r.payload; 
     i:=i+1; 
     end loop; 

    end get_data_Q1; 

gibi son ult_pkg ult_pkg paket vücut yerine 'ult_pkg' paketinin

--body; /

cevap

16

Bu mümkün değil, Accessing PL/SQL Index-by Tables bkz:

Oracle JDBC eleman türleri olarak RAW, TARİH ve PL/SQL KAYIT desteklemez.

muhtemelen şöyle bir özel (küresel değil, paket) nesne türünü kullanmayı tercih ediyorum

: paketinize

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 
/

referans tipi tablosu (t_all_records yerine tt_all_tab ait) ve şöyle doldurun

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; 

Sonucu şöyle java gelen kullanılabilir olacaktır:

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

Ama sonuçta, eğer hazır bir deyim olarak sorgunuzu sade bir sql deyiminde kullanabiliyor olsanız çabaya değer…

+0

bu kod benim için iyi çalışıyor .... –

+0

Hoşgeldiniz. –

+5

Hey guys, Oracle, ** 12c Sürüm 1 ** sürümünden bu yana iç paket türleri için destek ekliyor gibi görünüyor. Buradan okuyun: http://docs.oracle.com/cd/E16655_01/java.121/e17657/apxref.htm#CHEIIJCC – Alec