我想將一個oracle過程調用的out參數強制轉換爲對象。它不起作用,因爲 - 據我瞭解 - 我需要定義一個地圖,它告訴方法如何投射它。如果地圖是空格或不正確填充,它默認爲STRUCT類型的對象 - 這在我的情況中是錯誤的。如何在oracle中獲取一個表作爲輸出參數
我建一個樣品,這應該說明問題:由於錯誤地圖的
-- Procedure in database
PROCEDURE myprocedure (
inputParam IN VARCHAR2 (4),
outputOne OUT outputOneSQLType
outputTwo OUT outputTwoSQLType);
-- inside of a package
inside a package mypackage
-- first type
create or replace
TYPE outputOneSQLType IS TABLE OF tableOneExample
-- table of type
create or replace
TYPE tableOneExample AS OBJECT (
somethingOne VARCHAR2 (4)
,somethingTwo NUMBER (12)
)
//java from here
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
import oracle.jdbc.oracore.OracleTypeADT;
import oracle.sql.STRUCT;
...
oracle.jdbc.driver.OracleConnection oracleConn = (oracle.jdbc.driver.OracleConnection) con.getMetaData().getConnection();
final OracleCallableStatement storedProc = (OracleCallableStatement)oracleConn.prepareCall("{call mypackage.myprocedure("+
":inputParam, :outputOne, :outputTwo)}");
storedProc.setString("inputParam", "SomeValue");
storedProc.registerOutParameter("outputOne", OracleTypes.STRUCT, "OUTPUTONESQLTYPE");
storedProc.registerOutParameter("outputTwo", OracleTypes.STRUCT, "OUTPUTTWOSQLTYPE");
storedProc.execute();
//So far so good
//now I am lost - I need to define the map to get the object?
//What should be inside the map?
Hashtable newMap = new Hashtable();
newMap.put("outputOneSQLType", ?????.class);
//If the map is empty, it defaults to STRUCT...
final STRUCT myObject = (STRUCT)storedProc.getObject("somethingOne",newMap);
// myObject.getBytes() gives me an object... but I cannot cast it to anything
,我不能使用成才,如:
final MyClass myObject = (MyClass)storedProc.getObject("somethingOne",newMap);
我應如何填寫地圖?
編輯1
在Oracle數據庫中的條目不能被改變。我只被允許使用它們。因此,
stmt.registerOutParameter(2, java.sql.Types.ARRAY, "OUTPUTONESQLTYPE");
不起作用。因爲一旦我不使用「OracleTypes.STRUCT」就會引發異常。這似乎outputOneSQLType的這裏面有類型的對象「OracleTypeCOLLECTION」
當我嘗試
Hashtable newMap = new Hashtable();
newMap.put("outputOneSQLType",OracleTypeCOLLECTION.class);
final OracleTypeCOLLECTION myObject = (OracleTypeCOLLECTION)storedProc.getObject("somethingOne",newMap);
我得到一個異常:InstantiationException: oracle.jdbc.oracore.OracleTypeCOLLECTION
@DazzaL:我會嘗試定義一個接口SQLDATA 。也許這將是解決
SOLUTION
- 預處理語句應該是像 「開始package.procedure的(...);結束;」和不「{呼叫package.procedure的(...)})需要
- 一個SQLDATA接口
@DazzaL:!你統治THX
THX
然後在主類,你會如下映射此。我將嘗試定義一個SQLDATA接口。也許這將是解決方案。 –
棒極了,謝謝!我希望我可以添加+10 – spiderman
很好的爲我工作,發佈我的帖子 - http://stackoverflow.com/questions/25253448/java-plsql-call-table-of-records-from-java/25274486#25274486 – spiderman