Я обновил версии oracle
и ojdbc
с 11.1.0.2
до 12.1.0.2
. Я хочу дать array
типов объектов оракула в качестве параметра для оракула procedure
. Эта процедура принимает 2 varchar2
параметров на стороне оракула. Например, я отправляю 3 объекта в виде массива пар ключ-значение, и oracle принимает эти объекты. Моя проблема в том, что при вызове моей процедуры параметры (типа varchar2
) равны нулю.
Вот код, который я пробовал.
OracleConnection oraconn = conn.unwrap(OracleConnection.class);
Struct[] paramStructArray = new Struct[3];
paramStructArray[0] = oraconn.createStruct("KEY_VALUE_ENTRY",new Object[]{"key1","value1"});
paramStructArray[1] = oraconn.createStruct("KEY_VALUE_ENTRY",new Object[]{"key2","value2"});
paramStructArray[2] = oraconn.createStruct("KEY_VALUE_ENTRY",new Object[]{"key3","value3"});
Array array = oraconn.createOracleArray("KEY_VALUE_MAP", paramStructArray);
CallableStatement cstmt = getStatement(Statement.REGISTER_REQUEST);
cstmt.setString(1, requestId);
cstmt.setArray(2, array);
cstmt.execute();
Это мой код Java, а также мой оракул objects
CREATE OR REPLACE TYPE "KEY_VALUE_ENTRY" AS
OBJECT (
key VARCHAR2(32),
val VARCHAR2(2048)
);
CREATE OR REPLACE TYPE "KEY_VALUE_MAP" AS
TABLE OF key_value_entry;
и моя процедура
PROCEDURE register_request_(p_request_id IN varchar2
,p_params IN key_value_map) AS
BEGIN
IF p_params IS NOT NULL THEN
INSERT INTO test_table
(request, NAME, VALUE)
SELECT test_seq.nextval
,t.key
,t.val
FROM TABLE(CAST(p_params AS key_value_map)) t;
COMMIT;
END IF;
EXCEPTION
WHEN OTHERS THEN
RAISE;
END;
Я беру объекты типа 3 KEY_VALUE_ENTRY
на стороне оракула, но поля этих объектов key
и val
равны нулю. Я не могу понять, что я делаю неправильно.