説明
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
# パッチが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":"cccccccccccccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccccccccc"}'
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