Oracle プロシージャ コールの out パラメータをオブジェクトにキャストしようとしています。私が理解しているように、メソッドにキャスト方法を伝えるマップを定義する必要があるため、機能しません。マップが空の場合、または正しく埋められていない場合、デフォルトで STRUCT タイプの Objekt になります。これは私の場合は間違っています。
問題を説明するサンプルを作成しました。
-- 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
@DazzL: SQLDATA インターフェイスを定義してみます。多分それは解決策になるでしょう
解決
- 準備されたステートメントは、「begin package.procedure(...); end;」のようなものにする必要があります。NOT "{call package.procedure ( ...)})
- SQLData インターフェイスが必要です。
@DazzL: あなたが支配する! どうも。