首批通过分布式安全可靠测评,为关键业务系统打造
JSON_MERGEPATCH
更新时间:2026-03-27 15:37:02
描述
JSON_MERGEPATCH() 函数用于更新 target_json 数据的特定部分,根据 RFC 7396 的标准对两个或多个 JSON 文档执行合并返回合并结果,而不保留具有重复键的成员。 如果至少一个文档作为参数传递给此函数是无效的,则会引发错误。
JSON_MERGEPATCH() 执行合并的原理如下:
- 如果第一个参数不是对象,则合并的结果与空对象和第二个参数合并的结果相同。
- 如果第二个参数不是对象,则合并的结果是第二个参数。
- 如果两个参数都是对象,则合并的结果是具有以下成员的对象:
- 第一个对象的所有成员在第二个对象中没有具有相同键的对应成员。
- 第二个对象的所有成员在第一个对象中没有对应的键,并且其值不是 JSON Null 文字。
- 所有成员的键都存在于第一个和第二个对象中,并且其在第二个对象中的值不是 JSON Null 文字。
- 这些成员的值是递归合并第一个对象中的值与第二个对象中的值的结果。
语法
JSON_MERGEPATCH (
target_expr,
patch_expr
[RETURNING CLOB|BLOB|JSON|VARCHAR2|VARCHAR2[size],]
[PRETTY]
[ASCII]
[TRUNCATE]
[ERROR|NULL ON ERROR]);
语法说明
JSON_MERGEPATCH() 函数语法说明如下:
target_expr:目标 JSON 对象。patch_expr: 补丁 JSON 对象。RETURNING CLOB|BLOB|JSON|VARCHAR2|VARCHAR2[size]:用以指定返回值类型,其中VARCHAR2[size]可以限制返回值的长度。PRETTY:返回字符类型的时候是否使用字符串输出的 pretty-print。- ASCII:使用标准 ASCII Unicode 转义序列自动转义返回字符串中的任何非 ASCII Unicode 字符。
TRUNCATE:用以指定返回的文本应该根据返回类型被截断。ERROR子句:NULL ON ERROR:如果出错那么返回 Null,这也是默认设置。ERROR ON ERROR: 返回错误码。
示例
# 使用默认参数
obclient> SELECT json_mergepatch('{"a":"b"}', '{"b":"c"}') FROM DUAL;
+------------------------------------------+
| JSON_MERGEPATCH('{"A":"B"}','{"B":"C"}') |
+------------------------------------------+
| {"a": "b", "b": "c"} |
+------------------------------------------+
1 row in set
# 当 Patch 是 null, 相当于删除
obclient> SELECT json_mergepatch('{"a":"b"}', '{"a":null}') FROM DUAL;
+-------------------------------------------+
| JSON_MERGEPATCH('{"A":"B"}','{"A":NULL}') |
+-------------------------------------------+
| {} |
+-------------------------------------------+
1 row in set
# 相同的 Key 时会更新
obclient> SELECT json_mergepatch('{"a":["b"]}', '{"a":"c"}') FROM DUAL;
+--------------------------------------------+
| JSON_MERGEPATCH('{"A":["B"]}','{"A":"C"}') |
+--------------------------------------------+
| {"a": "c"} |
+--------------------------------------------+
1 row in set
# 使用 RETURNING 子句和 PRETTY 子句
obclient> SELECT json_mergepatch('{"a":"b", "b":"c"}', '{"a":null}' RETURNING CLOB PRETTY ) FROM DUAL;
+----------------------------------------------------------------------+
| JSON_MERGEPATCH('{"A":"B","B":"C"}','{"A":NULL}'RETURNINGCLOBPRETTY) |
+----------------------------------------------------------------------+
| {
"b": "c"
} |
+----------------------------------------------------------------------+
1 row in set
# 使用 TRUNCATE 子句生效
obclient> SELECT json_mergepatch(
'{"a":"b"}',
'{"a":"cccccccccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccccccccccccc"}'
RETURNING varchar2(32) PRETTY TRUNCATE) FROM DUAL;
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| JSON_MERGEPATCH('{"A":"B"}','{"A":"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"}'RETURNINGVARCHAR2(32)PRETTYTRUNCATE) |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| {
"a": "cccccccccccccccccccccc |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set
# 使用 ERROR 子句
obclient> SELECT json_mergepatch('{', '[1,2,3]' ERROR ON ERROR) FROM DUAL;
OBE-40441: JSON syntax error
# 默认对错误处理返回 NULL
obclient> SELECT json_mergepatch('{', '[1,2,3]') FROM DUAL;
+--------------------------------+
| JSON_MERGEPATCH('{','[1,2,3]') |
+--------------------------------+
| NULL |
+--------------------------------+
1 row in set
# 指定 ERROR 子句的处理
obclient> SELECT json_mergepatch('{', '[1,2,3]' NULL ON ERROR) FROM DUAL;
+-------------------------------------------+
| JSON_MERGEPATCH('{','[1,2,3]'NULLONERROR) |
+-------------------------------------------+
| NULL |
+-------------------------------------------+
1 row in set