Oracle 19c插入含&的JSON字段异常,求前端正确插入方案
问题解决方法
核心原因
Oracle中&是默认的变量替换符,当JSON内容包含&ORACLE时,Oracle会将其识别为需要输入值的绑定变量,进而导致解析错误,甚至错误替换内容。
具体解决方案
1. 临时禁用会话级变量替换
在执行JSON插入/解析的SQL前,先执行以下命令关闭变量替换功能:
SET DEFINE OFF;
执行完相关操作后,如果需要恢复变量替换,可以执行:
SET DEFINE ON;
注意:这个设置仅对当前会话有效,适合在并发程序的数据库会话初始化阶段执行,避免影响其他需要使用绑定变量的业务逻辑。
2. 转义JSON中的&符号
在将JSON数据传入Oracle前,把所有&替换为\&,确保Oracle将其视为普通字符。例如:
原JSON字段:
"Column1":"JAVA & ORACLE"
转义后:
"Column1":"JAVA \& ORACLE"
注意:转义操作需要在程序端完成,确保转义后的JSON格式仍然合法,避免JSON解析失败。
3. 修正JSON解析SQL的路径表达式
你当前的SQL中,JSON路径的数组写法存在不必要的转义,Oracle的JSON路径语法中数组直接用$.Data[*]即可,无需转义方括号。修正后的SQL如下:
WITH json AS ( SELECT pin_clob doc FROM dual ) SELECT Column1 FROM json_table( (SELECT doc FROM json), '$.Data[*]' COLUMNS ( Column1 VARCHAR2(70) PATH '$.Column1') );
错误的转义可能导致JSON解析异常,修正后能确保正确遍历Data数组中的元素。
推荐方案
如果并发程序中没有依赖Oracle变量替换的场景,优先使用方案1,操作简单且不影响JSON内容本身;如果必须保留变量替换功能,则使用方案2在程序端处理JSON字符串;同时务必修正SQL中的路径表达式(方案3),避免额外的解析问题。
内容的提问来源于stack exchange,提问作者sidhant jain
相关产品推荐
相关产品推荐

