Oracle中JSON数据插入无报错但未生效问题排查
Oracle JSON插入无数据问题排查指南
1. 优先校验JSON格式合法性
你提供的JSON {claim=[{remote_claimid=5680}, {remote_claimid=7654}]} 不符合标准JSON规范:
- 所有键名必须用双引号包裹,键值对分隔符必须是冒号(不是等号)
- 正确格式应为:
{"claim":[{"remote_claimid":5680},{"remote_claimid":7654}]} - 若传入的转义后字符串仍不标准,
JSON_TABLE会无法解析出任何数据,自然不会产生插入行为
2. 检查存储过程的JSON解析逻辑
确保JSON_TABLE的路径表达式与JSON结构完全匹配,示例正确的插入逻辑如下:
INSERT INTO TEST(remote_claimid) SELECT jt.remote_claimid FROM JSON_TABLE( p_json_clob, '$.claim[*]' COLUMNS ( remote_claimid NUMBER PATH '$.remote_claimid' ) ) jt;
- 确认
$.claim[*]是否指向JSON中的数组节点 - 检查列类型映射是否正确(比如
remote_claimid是数字类型就用NUMBER,字符串则用VARCHAR2)
3. 验证事务提交状态
- 若存储过程中未显式执行
COMMIT,调用后需在外部提交事务;PL/SQL块调用时,确保最终有提交操作 - 排查是否存在隐式回滚:比如存储过程内部有未捕获的异常,导致事务自动回滚
4. 排查权限与主键冲突
- 确认执行存储过程的用户拥有TEST表的
INSERT权限 - 检查待插入的
remote_claimid是否已存在(主键重复会触发错误,但你说无报错,可先查询TEST表是否已有这两个ID;也可在存储过程中添加异常捕获,输出错误信息):
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN DBMS_OUTPUT.PUT_LINE('主键重复: ' || jt.remote_claimid); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('错误详情: ' || SQLERRM);
5. 单独测试JSON解析结果
直接执行JSON_TABLE查询,验证是否能解析出数据:
SELECT * FROM JSON_TABLE( '{"claim":[{"remote_claimid":5680},{"remote_claimid":7654}]}', '$.claim[*]' COLUMNS ( remote_claimid NUMBER PATH '$.remote_claimid' ) );
如果返回两行数据,说明解析逻辑正常,问题出在插入环节;若无返回,就是JSON格式或解析路径错误
内容的提问来源于stack exchange,提问作者caracol
相关产品推荐
相关产品推荐

