EXCEPTION (Snowflakeスクリプト)¶
Snowflakeスクリプトのブロックで発生した例外の処理方法を指定します。
例外の詳細については、 処理の例外 をご参照ください。
- こちらもご参照ください:
構文¶
条件:
exception_name現在のブロックの DECLARE 部分、またはそれを囲むブロックで定義された例外名。
使用上の注意¶
各 ブロック は、独自の例外ハンドラーを持つことができます。
Snowflakeは、ブロックごとに1つだけの例外ハンドラーをサポートします。ただし、そのハンドラーは、複数の
WHEN句を使用することで、複数のタイプの例外をキャッチできます。WHEN OTHER [ { EXIT | CONTINUE } ] THEN句は、まだ指定されていない例外をキャッチします。例外ハンドラーは、それが宣言されたブロックの BEGIN と EXCEPTION セクションの間のステートメントに適用されます。ブロックの DECLARE セクションには適用されません。
例外ハンドラーは、指定された例外が スコープ にある場合にのみ、指定された例外を処理できます。
ストアドプロシージャが値を返すことを目的としている場合は、例外ハンドラーの
EXIT型の 各 ` ``WHEN` 句を含む、可能な各終了パスから値を返す必要があります。例外ハンドラで変数を使うには、変数を DECLARE セクションで宣言するか、ストアドプロシージャに引数として渡す必要があります。BEGIN ... END セクションでは宣言できません。詳細については、 Snowflakeスクリプトで例外ハンドラーに変数を渡す をご参照ください。
例外が発生すると、ハンドラーの条件が順番にチェックされ、最初に一致した
WHEN句が使われます。ブロック内の順序は上から下になり、内側のブロックは外側のブロックより先にチェックされます。EXITまたはCONTINUEハンドラーのマッチングに優先順位はなく、先に一致した方が使用されます。1つのステートメントに一致するハンドラーは1つだけです。しかし、例外ハンドラー本体の内側で発生した例外は、外側のブロックの例外ハンドラーをトリガーすることができます。
例外ハンドラーの各
WHEN句は、以下のいずれかのタイプになります。EXIT- このブロックはハンドラー内のステートメントを実行し、現在のブロックを終了します。ブロックがこのタイプの例外を実行し、ブロックに例外ハンドラーの後にステートメントが含まれている場合、それらのステートメントは実行されません。ブロックが内側のブロックであり、例外ハンドラーが
RETURNステートメントを含んでいない場合、実行は内側のブロックを終了し、外側のブロックのコードを続行します。EXITがデフォルトです。CONTINUE- このブロックはハンドラー内のステートメントを実行し、エラーの原因となったステートメントの直後のステートメントを続行します。
EXCEPTION句は、EXITとCONTINUEの両方の型のWHEN句を持つことができます。CONTINUE型のWHEN句については、以下の使用上の注意が適用されます。分岐構造 でエラーが発生した場合、継続ステートメントは分岐構造の直後のステートメントになります。
ループ の条件でエラーが発生した場合、継続ステートメントはループの直後のステートメントになります。
ループ本体でエラーが発生した場合、継続ステートメントはループの次の繰り返しのステートメントになります。例については、 例外を処理して続行する をご参照ください。
RETURN ステートメントでエラーが発生した場合、継続ステートメントは
RETURNステートメントの直後のステートメントになります。ネストされたストアドプロシージャ でエラーが発生し、そのエラーが外部スコープで処理された場合、継続ステートメントはストアドプロシージャ呼び出しの直後のステートメントになります。
CONTINUE型のWHEN句にRETURNステートメントを含めないようにしてください。RETURNステートメントを含めると、ストアドプロシージャは続行せずに戻ります。
CONTINUE型のWHEN句について、以下の例は、さまざまなシナリオにおいて、どのステートメントがエラーの原因となったステートメントの直後のステートメントであるかを示しています。これらの例では、error_expressionは例外を発生させた式であり、continue_statementは、CONTINUEハンドラーステートメントの後のブロックでコードが続行するステートメントです。
例¶
以下の例では、例外を宣言して発生させ、例外ハンドラーで例外を処理しています。
複数の型の例外を処理する¶
次の例は、複数の型の例外を処理するように設計された例外ハンドラーを示しています。
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
この出力は、例外ハンドラーが例外をキャッチしたことを示しています。
例外を処理して続行する¶
次の例は、 CONTINUE 型の WHEN 句を持つ例外ハンドラーを示しています。
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
出力は、例外ハンドラーが例外をキャッチし、カウンターに 1 を追加するステートメントを実行し、例外がキャッチされた後に次のステートメントを実行して、カウンターに 10 を追加したことを示しています。
次の例は、 CONTINUE 型の WHEN 句を持つ例外ハンドラーが、ループ内でエラーが発生したときにどのように動作するかを示しています。この例では、値 10 をゼロで割ろうとしているため、最初の繰り返しでエラーが発生します。CONTINUE ハンドラーは error_log_table にエラーを記録し、ブロックは 10 を 1 で割るループの次の繰り返しを続行します。ループは、 10 が 5 で割られ、ループが終了するまで繰り返されます。出力は 2 です。
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
ネストされたブロックで例外を処理する¶
次の例はネストされたブロックを示しており、内側のブロックが、内側のブロックまたは外側のブロックのどちらかで宣言された例外を発生させる可能性があることを示しています。
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
この出力は、例外ハンドラーが例外をキャッチしたことを示しています。
次の例は前の例と似ていますが、ネストされたブロックを示しています。各ブロックには独自の例外ハンドラーがあります。
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
注釈
この例では、外側と内側のブロックで同じ例外名( e1 )を使用していますが、これは推奨されません。
この例では、例外名の スコープ を説明するためにこれを実行しています。e1 という名前の2つの例外は、異なる例外です。
外側のブロックの e1 ハンドラーは、内側のブロックで宣言および発生した例外e1を処理しません。
この出力は、内側の例外ハンドラーが実行されたことを示しています。
同一句内の複数の例外と不特定例外を処理する¶
次の例は、2つのタスクを実行する方法を示しています。
ORを使用して、同じ句で複数の例外をキャッチします。WHEN OTHER THENを使用して不特定の例外をキャッチします。
組み込み変数を使用して例外を処理する¶
次の例は、例外をキャッチしたときに SQLCODE 、 SQLERRM ( SQL エラーメッセージ)、 SQLSTATE 組み込み変数値 を返す方法を示しています。
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
この例を実行すると、次の出力が生成されます。