説明
JSON_MERGEPATCH()関数は、RFC 7396の基準に従って2つ以上のJSONドキュメントをマージし、重複するキーを持つメンバーを保持せずに、target_jsonデータの特定の部分を更新するために使用されます。 この関数に少なくとも1つの無効なドキュメントがパラメータとして渡された場合、エラーが発生します。
JSON_MERGEPATCH()がマージを実行する仕組みは次のとおりです:
- 最初のパラメータがオブジェクトでない場合、マージ結果は空のオブジェクトと2番目のパラメータをマージした結果と同じになります。
- 2番目のパラメータがオブジェクトでない場合、マージ結果は2番目のパラメータになります。
- 2つのパラメータがオブジェクトの場合、マージ結果は次のメンバーを持つオブジェクトになります:
- 最初のオブジェクトのすべてのメンバーに対して、2番目のオブジェクトに同じキーを持つ対応するメンバーが存在しない。
- 2番目のオブジェクトのすべてのメンバーに対して、最初のオブジェクトに対応するキーがなく、その値がJSON Null文字ではない。
- すべてのメンバーのキーが最初と2番目のオブジェクトに存在し、その値が2番目のオブジェクトにおいてJSON Null文字ではない。
- これらのメンバーの値は、最初のオブジェクトの値と2番目のオブジェクトの値を再帰的にマージした結果です。
構文
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":"cccccccccccccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccccccccccccc"}'
RETURNING varchar2(32) PRETTY TRUNCATE) FROM DUAL;
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| JSON_MERGEPATCH('{"A":"B"}','{"A":"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"}'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