は、3つのOracleのカスタムタイプは(簡体字)としては、以下のとおりです。オブジェクトツリーを構築ストアドプロシージャによって返される構造体からARRAYを読むデータベースで
create or replace TYPE T_ENCLOSURE AS OBJECT(
ENCLOSURE_ID NUMBER(32,0),
ENCLOSURE_NAME VARCHAR2(255 BYTE),
ANIMALS T_ARRAY_ANIMALS,
MEMBER FUNCTION CHECK_IF_RED RETURN BOOLEAN
);
create or replace TYPE T_ARRAY_ANIMALS is TABLE OF T_ANIMAL;
create or replace TYPE T_ANIMAL AS OBJECT(
ANIMAL_ID NUMBER(32,0),
NUMBER_OF_HAIRS NUMBER(32,0)
);
と機能、
FUNCTION GET_ENCLOSURE (f_enclosure_id zoo_schema.ENCLOSURE_TABLE.ENCLOSURE_ID%TYPE) RETURN T_ENCLOSURE
AS
v_ENC T_ENCLOSURE;
v_idx pls_integer;
BEGIN
v_ENC := T_ENCLOSURE(
f_enclosure_id,
NULL,
T_ARRAY_ANIMALS(T_ANIMAL(NULL,NULL))
);
SELECT ENCLOSURE_NAME
INTO v_ENC.ENCLOSURE_NAME
FROM ENCLOSURE_TABLE WHERE ENCLOSURE_ID = f_ENCLOSURE_ID;
SELECT
CAST(MULTISET(
SELECT ANIMAL_ID, NUMBER_OF_HAIRS
FROM ANIMAL_TABLE
WHERE ENCLOSURE_ID = f_ENCLOSURE_ID
) AS T_ARRAY_ANIMALS
)
INTO v_ENC.ANIMALS
FROM dual;
RETURN v_ENC;
END;
今度はGET_ENCLOSURE
関数を呼び出して、その結果のT_ENCLOSURE
オブジェクトをJavaコードに入れたいと思います。
// prepare the call
Connection connection = MyConnectionFactory.getConnection(SOME_CONNECTION_CONFIG);
CallableStatement stmt = connection.prepareCall("{? = call zoo_schema.zoo_utils.GET_ENCLOSURE(?)}");
stmt.registerOutParameter(1, OracleTypes.STRUCT, "zoo_schema.T_ENCLOSURE");
stmt.setInt(2, 6); // fetch data for ENCLOSURE#6
// execute function
stmt.executeQuery();
// extract the result
Struct resultStruct = (Struct)stmt.getObject(1); // java.sql.Struct
私は
Integer id = ((BigInteger)resultStruct.getAttributes()[0]).intValue(); // works for me
String name = (String)resultStruct.getAttributes()[1]); // works for me
経由IDとNAMEにアクセスすることができますしかし、私は動物
resultStruct.getAttributes()[2].getClass().getCanonicalName(); // oracle.sql.ARRAY
ARRAY arrayAnimals = (ARRAY)jdbcStruct.getAttributes()[2];
arrayAnimals.getArray(); // throws a java.sql.SQLException("Internal Error: Unable to resolve name")
のリストを取得するように見えることができない私は、裁判のビットを持っていたし、ここを含むエラー
OracleConnection oracleConnection = connection.unwrap(OracleConnection.class);
STRUCT resultOracleStruct = (STRUCT) stmt.getObject(1); // oracle.sql.STRUCT
oracleConnection.createARRAY("zoo_schema.T_ARRAY_ANIMALS", resultOracleStruct.getAttributes()[2]) // throws an SQLException("Fail to convert to internal representation: [email protected]")
でも運がない。
List<TAnimal>
に動物のリストを取得するにはどうすればよいですか?
JDBCからTABLE OF配列(plsql型)を直接または標準的に取り出す方法はないと思います。通常、Java(JDBC)からSQLオブジェクトを返すプロシージャは、PlSQlオブジェクトではなく(OBJECT型の中にラップされていても、それらを取り出すことはできません)のみコールできます。私は1)オブジェクトのテーブルを文字列に変換し(カンマなどで区切って)、クライアントで手動で解析する2)/questions/37767761/plsql-how-to-return-associative-array-to-java?rq = 1) –
非常にオラクル固有のソリューションはまったく問題ありません。このプロジェクトではデータベースは変更されません。 – DerMike
GET_ENCLOSUREをデバッグするコードを提供できますか? –