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 EXISTINGREPLACE ON EXISTING

  • CREATE ON MISSING (デフォルト)

  • NULL ON NULL (デフォルト)、IGNORE ON NULLERROR ON NULLREMOVE ON NULL

  • NULL ON EMPTY (デフォルト)、IGNORE ON EMPTYERROR ON EMPTY

  • ERROR ON ERROR (デフォルト)、IGNORE ON ERROR