18.4 SQLファンクションおよび条件のエラー句
JSONデータに対する一部のSQL問合せファンクションおよび条件は、オプションでエラー句を受け入れます。この句によって、ファンクションまたは条件によって発生した実行時エラーの処理方法を指定します。この句についてと、デフォルト動作(エラー句なし)についてまとめます。
デフォルトでは、JSON用のSQLファンクションおよび条件により、実行時エラーの発生が回避されます。たとえば、JSONデータが構文的に無効な場合、json_exists
およびjson_equal
はfalseを戻し、json_value
はNULL
を戻します。
ただし、場合によってはデフォルト動作をオーバーライドするエラー句を指定することもできます。指定できるエラー処理は異なりますが、エラー処理を指定可能なJSON用の各SQLファンクションおよび条件では、少なくともエラー発生のERROR ON ERROR
動作がサポートされます。
オプションのエラー句は次の形式を使用できます。
-
ERROR ON ERROR
- エラーを発生させます(特別な処理なし)。 -
NULL ON ERROR
- エラーを発生させるかわりにNULL
を戻します。json_exists
に使用できません。 -
FALSE ON ERROR
- エラーを発生させるかわりにfalseを戻します。デフォルトである
json_exists
およびjson_equal
にのみ使用できます。 -
TRUE ON ERROR
- エラーを発生させるかわりにtrueを戻します。json_exists
およびjson_equal
にのみ使用できます。 -
EMPTY OBJECT ON ERROR
- エラーを発生させるかわりに空のオブジェクト({}
)を戻します。json_query
にのみ使用できます。 -
EMPTY ARRAY ON ERROR
- エラーを発生させるかわりに空の配列([]
)を戻します。json_query
にのみ使用できます。 -
EMPTY ON ERROR
–EMPTY ARRAY ON ERROR
と同じ。 -
DEFAULT '
literal_return_value
' ON ERROR
- エラーを発生させるかわりに指定した値を戻します。値は、問合せのコンパイル時に定数である必要があります。使用不可:
-
json_exists
、json_equal
、json_serialize
、json_scalar
、json_mergepatch
、またはjson_exists
動作が含まれたjson_table
列値句の場合 -
json_query
、またはjson_query
動作を含むjson_table
列値句 -
json_table
の低レベル・エラー処理 -
SDO_GEOMETRY
がjson_value
のRETURNING
句データ・タイプとして、またはjson_table
列データ・タイプとして指定されている場合
-
デフォルト動作は、NULL ON ERROR
ですが、条件json_exists
およびjson_equal
の場合は該当しません。
ただし、パラメータJSON_BEHAVIOR
を使用して、特定のデータベース・セッションのデフォルトの動作を変更できます。これは、デフォルトの動作としてNULL ON ERROR
が指定されたSQL演算子のエラー・ハンドラにのみ影響します。つまり、キーワードEXISTS
を使用する列(json_exists
セマンティクスを持つ列)のSQL条件json_exists
およびjson_equal
またはSQLファンクションjson_tableには影響しません。影響するのは、EXISTS
のないファンクションjson_value
、json_query
およびjson_table
のみです。
JSON_BEHAVIOR
に指定する値は、次のように、現在のセッションに使用するデフォルトの動作を指定します:
-
ON_ERROR:ERROR
—ERROR ON ERROR
動作がセッションのデフォルトです。 -
ON_ERROR:NULL
—NULL ON ERROR
動作がセッションのデフォルトです。
一般的なユースケースは、デバッグの目的でパラメータをON_ERROR:ERROR
に設定し、パス式の評価で問合せされたJSONデータで一致する値が見つからない場合にエラーを発生させることです。例18-1に、これを示します。
ノート:
json_table
のエラー処理には2つのレベルがありますが、これらは、パス式の2つのレベルである行と列に対応しています。存在する場合、列のエラー・ハンドラにより、行レベルのエラー処理がオーバーライドされます。両レベルのデフォルトのエラー・ハンドラはNULL ON ERROR
です。
ノート:
欠落フィールドの照合を試行したことによるエラーの場合、ON EMPTY
句はON ERROR
で指定された動作より優先されます。
ノート:
ON ERROR
句は、構文的に正しいSQL/JSONパス式がJSONデータに対して照合されたときに発生する実行時エラーに対してのみ有効です。構文的に正しくないパス式の場合、コンパイル時エラーが発生します。これは、ON ERROR
句によっては処理されません。
例18-1 パラメータJSON_BEHAVIORを使用したERROR ON ERROR動作の指定
デフォルトでは、json_value
はエラー時にNULL
を返し、エラーのある問合せに気付きにくくなる可能性があります。この問合せは、パス式$.a
が単一のスカラー値と一致せず、複数の値1
および2
と一致するため、NULL
を返します。
SELECT json_value('[{a:1},{a:2}]', '$.a');
このコードは、現在のセッションのパラメータJSON_BEHAVIOR
の値を変更するので、同じエラーが検出されるとNULL
を返すのではなく、実際にエラーが発生します:
ALTER SESSION SET JSON_BEHAVIOR="ON_ERROR:ERROR"
SELECT json_value('[{a:1},{a:2}]', '$.a');
ORA-40470: JSON query '$.a' evaluated to multiple values.
このコードは、パラメータをデフォルト値にリセットします:
ALTER SESSION SET JSON_BEHAVIOR="ON_ERROR:NULL"
関連項目:
-
JSON用のSQLファンクションのエラー句の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
-
JSON用のSQL条件のエラー句の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
-
『Oracle Databaseリファレンス』の「JSON_BEHAVIOR」