13.7 JSON_TRANSFORMの演算子INSERT
JSON_TRANSFORM
の演算子INSERT
は、指定された場所(オブジェクト・フィールドまたは配列位置)に値を挿入します。
これは、LHSのパス式で対象となっている場所に、RHSのSQL式の値を挿入します。そのパス式では、オブジェクトのフィールド、または配列位置が対象となっている必要があります(そうでない場合はエラーが発生します)。デフォルトでは、対象となるオブジェクトのフィールドがすでに存在する場合、エラーが発生します。
(オブジェクトのフィールドのINSERT
は、CREATE ON MISSING
句(SET
のデフォルト)を指定したSET
と同じ効果があります。ただし、ON EXISTING
のデフォルトの動作は、REPLACE
ではなくERROR
です。)
配列の現在の末尾より後の配列位置を指定できます。その場合には、指定された位置への値の挿入に対応できるように配列の長さが調整され、それによって間に入れられた位置には、JSONのnull
値が埋め込まれます。
たとえば、入力のJSONデータが{"a":["b"]}
の場合、INSERT '$.a[3]'=42
は変更されたデータとして{"a":["b", null, null 42]}
を返します。配列位置1および2の要素は、null
です。
例13-13 JSON_TRANSFORM: オブジェクトへのフィールドの挿入
このコードでは、入力オブジェクト(空)にメンバー"a":"hello"
を挿入しています。
SELECT json_transform('{}',
INSERT '$.a' = 'hello')
結果:
{"a":"hello"}
例13-14 JSON_TRANSFORM: すでに存在するフィールドの挿入は失敗
このコードでは、入力オブジェクトにメンバー"a":"hello"
を挿入しようとしています。その入力オブジェクトにはすでにフィールドa
があるため、この操作は失敗します。
SELECT json_transform('{"a":1}',
INSERT '$.a' = 'hello')
ORA-40763: 値はすでに存在します
というエラーが発生します。
例13-15 JSON_TRANSFORM: 配列への要素の挿入
このコードでは、文字列"hello"
を配列a
の3番目の要素(新規)として挿入しています。当初の3番目の要素(3
)および4番目の要素(4
)は、4番目と5番目の要素になります。
SELECT json_transform('{"a":[1,2,3,4]}',
INSERT '$.a[2]' = 'hello')
結果:
{"a":[ 1, 2, "hello", 3, 4 ]}
演算子INSERT
で使用できるハンドラは次のとおりです:
-
ERROR ON EXISTING
(デフォルト)、IGNORE ON EXISTING
、REPLACE ON EXISTING
-
CREATE ON MISSING
(デフォルト) -
NULL ON NULL
(デフォルト)、IGNORE ON NULL
、ERROR ON NULL
、REMOVE ON NULL
-
NULL ON EMPTY
(デフォルト)、IGNORE ON EMPTY
、ERROR ON EMPTY
。 -
ERROR ON ERROR
(デフォルト)、IGNORE ON ERROR
。