java - 使用 oracle 对象参数调用 oracle 存储过程
问题描述
我将版本从升级oracle
到. 我想将oracle 对象类型作为参数提供给 oracle 。这个过程在 oracle 端有 2 个参数。例如,我将 3 个对象作为键值对数组发送,oracle 接受这些对象。我的问题是调用我的过程时参数(类型)为空。ojdbc
11.1.0.2
12.1.0.2
array
procedure
varchar2
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 代码,这也是我的 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 种类型的对象,但这个对象key
和val
字段都是空的。我无法弄清楚我做错了什么。
解决方案
有Encoding
问题,其中java
给出和oracle
接受这个值,在添加orai18n.jar
我的classpath
一切工作正常之后
推荐阅读
- java - 在一个范围内有效地生成一个随机素数
- c# - 优化简单方法时遇到问题
- javascript - 尝试构建一个下拉菜单,在按键时开始动画
- mysql - 如果 MySQL 案例语句遇到意外值,则创建错误
- sql - 当 BigQuery 中没有任何“id”类型列时转置行和列
- python - S3 选择 CSV 中的检索标头
- perl - 如何使用一列索引值在单独的数据集中创建新列
- javascript - Userscript 不会将文本输入聚焦在某些页面上
- json - 将多个 JSON 数组写入文件
- autodesk-forge - Autodesk Forge - 转换和发布作业是否只完成一次还是被覆盖