2013-02-28 27 views
1

我必須使用JDBC Oracle驅動程序從Oracle應用程序調用Oracle數據庫中的存儲過程,其中有些參數是簡單類型(VARCHAR2,NUMBER,...),其他是對象或對象的事件表。如何使用類型化參數從Java callablestatement調用Oracle過程?

create or replace 
type t_TYPE as object (In_PARAM VARCHAR2(255) ); 

create or replace 
type t_TYPE_array is table of t_TYPE ; 

PROCEDURE SOME_PROC (in_myParam IN t_TYPE_array, out_retVal OUT NUMBER) AS ... 

我在的Java 1.6和ojdbc6,我的方式是java.sql.CallableStatement中,但我接受其他解決方案(JDBC驅動程序的頂部)。

P.S.這是一個在Jboss 5中運行的企業應用程序(從數據源連接)。

感謝

回答

0

我會用這樣的事情對於接受VARCHAR和一些與數字輸出輸入一些存儲過程做到這一點。

Connection conn = null; 
    CallableStatement cs = null; 
    try { 
     conn = dataSource.getConnection(); 
     cs = conn.prepareCall("{ CALL pkg.someproc(?,?,?) }"); 

     //populate stored proc parameters 
     cs.setString(1, param1); 
     cs.setInt(2, param2); 
     cs.registerOutParameter(3, Types.NUMERIC); 

     //execute stored procedure 
     cs.execute(); 
    } 
+0

感謝您的答覆,這是原生型PARAMS一個簡單的電話...我的問題是關於複合型PARAMS :( – Mito 2013-02-28 08:44:30

+0

肯定的是,什麼樣的則params的是我們在談論什麼?:)如果你需要數組,你可以使用oracle.sql.ARRAY,然後cs.setArray – 2013-02-28 08:56:00

+0

哼,你可以在問題的正文中找到參數定義! :) – Mito 2013-02-28 09:01:54

2

發現自己:

StructDescriptor structDesc = StructDescriptor.createDescriptor(TYPE_STRUCT, dbConnection); 
ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor(TYPE_ARRAY, dbConnection); 

Object[] objType = new Object[1]; 
objType[0] = new String("param data"); 
oracle.sql.STRUCT struct = new oracle.sql.STRUCT(structDesc, dbConnection, objType); 

Object[] arrayObj = new Object[size]; 
arrayObj[0] = struct; 
arrayObj[1] = struct1; 
[...] 
oracle.sql.ARRAY array = new oracle.sql.ARRAY(arrayDesc, dbConnection, arrayObj); 

callableStatement = dbConnection.prepareCall(MY_CALL); 
[...] 
callableStatement.setArray(4, array); 
相關問題