Oracle使用json_mergepatch更新JSON列变为NULL及4000字符限制问题咨询
问题原因
你遇到的json_mergepatch执行后返回NULL的问题,根因是Oracle JSON函数的默认返回类型限制:
- Oracle内置
json_mergepatch函数默认返回VARCHAR2类型,在SQL执行上下文里,VARCHAR2的最大长度默认为4000字节,当合并后的JSON内容超过该长度时,返回值就会溢出被置为NULL,哪怕你存储JSON的目标列是CLOB类型也会触发该问题。 - 如果你传入的补丁内容是长度超过4000的字符串字面量,会在参数解析阶段就触发截断,导致JSON解析失败返回NULL。
解决方法
你可以通过显式指定函数返回类型、入参转CLOB两个操作突破长度限制,修改后的SQL如下:
UPDATE users SET user = json_mergepatch(user, to_clob('{"email":"tony@mail.com"}') RETURNING CLOB) WHERE name = 'Tony';
操作说明:
- 新增
RETURNING CLOB子句,指定json_mergepatch函数的返回值为CLOB类型,规避4000字节的默认长度限制 - 用
to_clob()包裹补丁JSON内容,避免补丁本身过长时被默认解析为VARCHAR2触发截断 - 如果你的补丁内容本身就存储在CLOB类型的变量/字段中,可以直接传入不需要
to_clob转换
另外建议你给存储JSON的列增加IS JSON约束,避免非法JSON数据写入导致函数处理失败。
内容的提问来源于stack exchange,提问作者user5507535
相关产品推荐
相关产品推荐

