首页 > 解决方案 > 使用 oracle 对象参数调用 oracle 存储过程

问题描述

我将版本从升级oracle到. 我想将oracle 对象类型作为参数提供给 oracle 。这个过程在 oracle 端有 2 个参数。例如,我将 3 个对象作为键值对数组发送,oracle 接受这些对象。我的问题是调用我的过程时参数(类型)为空。ojdbc11.1.0.212.1.0.2arrayprocedurevarchar2varchar2

这是我尝试过的代码。

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 代码,这也是我的 oracleobjects


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;

KEY_VALUE_ENTRY在 oracle 端采用 3 种类型的对象,但这个对象keyval字段都是空的。我无法弄清楚我做错了什么。

标签: javaoracle12c

解决方案


Encoding问题,其中java给出和oracle接受这个值,在添加orai18n.jar我的classpath一切工作正常之后


推荐阅读