2012-05-22 101 views
4

我需要使用參數類型爲PL/SQL表的過程對JDBC進行調用。 我想用結構對象。但我沒有做一些正確的事情。 我得到錯誤: ORA-04043:object「scott」。「objListStruct」不存在。使用PL類型參數對Oracle存儲過程進行JDBC調用SQL表

這裏是代碼片段:

conn = Application.getDBConnection(); 
       CallableStatement cStmt = null; 
       cStmt= conn.prepareCall("{call package1.procedure1"+"(?)}"); 
       Struct objListStruct = conn.createStruct("objListStruct", 
           objNameArr.toArray()); 
       cStmt.setObject(1, objListStruct,Types.STRUCT); 

的參數, 「?」對於此過程,類型爲:

TYPE t_name IS TABLE OF TABLE1.name%TYPE 

任何洞察力,使這項工作受到高度讚賞。 感謝

+0

objNameArr是準備去 –

+0

在您的評論的一個數據的ArrayList中,你說「嚴格地說,類型應該是TYPE t_name IS TABLE1.name%表TYPE INDEX by BINARY_INTEGER「。這與您在此給出的類型定義衝突。哪個是對的? Oracle中的類型是在SQL還是PL/SQL中定義的? –

回答

1

兩件事情:

1)最簡單的方法是沒有什麼傳遞給過程。創建一個全局臨時表,插入所需的所有數據,然後調用從臨時表中讀取的proc。只是要小心,你不能自動連接你的連接。

2)如果你的傳入一個數組,你需要下拉並使用Oracle數組類型。 Oracle數組類型將綁定到表類型。因此,類似的東西(注:代碼未測試),以這樣的:

Object[] arrayObject = { x, y }; 

ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor(
     "MY_SCHEMA.MY_ARRAY_TYPE", conn); 
ARRAY myArray = new ARRAY(descriptor, conn, arrayObject); 


CallableStatement cs = conn 
     .prepareCall("{ call package1.procedure1(?)}"); 
cs.setArray(1, myArray); 
cs.execute(); 
conn.close(); 
+0

謝謝!我會試試這個。我假設MY_SCHEMA是我的模式名稱。 –

+0

什麼是MY_ARRAY_TYPE? –

+0

在你的例子中,它將是t_name。 – Nick

1
String[] varStrArr = varArr.toArray(new String[compNameArr.size()]); 
OracleCallableStatement cStmt = (OracleCallableStatement) 
conn.prepareCall("BEGIN SCHEMA.PACKAGE.procedure(?);END;"); 
cStmt.setPlsqlIndexTable(1,varStrArr,varStrArr.length,varStrArr.length, 
         OracleTypes.VARCHAR, 50); 
cStmt.execute(); 

上面的代碼工作。 更多的參考材料,請訪問:。 Binding IN Parameters

+0

使用OracleCallableStatement並在該語句中調用setPlsqlIndexTable()是我做這兩件事情的工作。 –

相關問題