説明
JSON_MERGEPATCH() 関数は、target_json データの特定部分を更新するために使用されます。RFC 7396 の規格に従って、2つ以上の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":"cccccccccccccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccccccccccccc"}'
RETURNING varchar2(32) PRETTY TRUNCATE) FROM DUAL;
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| JSON_MERGEPATCH('{"A":"B"}','{"A":"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"}'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