我将
下面是我尝试过的代码:
和我的程序
oracle
和ojdbc
版本从11.1.0.2
升级到12.1.0.2
。我想将一组oracle对象类型作为参数传递给一个oracle procedure
。这个过程在oracle端需要两个varchar2
参数。例如,我发送了三个对象作为一个键值对数组,并且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代码,这里还有我的Oracle 对象
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;
我正在Oracle端获取3个KEY_VALUE_ENTRY
类型的对象,但是这些对象的key
和val
字段都为空。我无法弄清楚我做错了什么。