例外
SQL スクリプトで例外を定義するには、例外に一意の名前を指定し、その名前のプロシージャを定義して例外条件を処理します。
構文
DECLARE [PUBLIC] <exceptionName> EXCEPTION
親スコープで宣言されたものと同じ名前の子スコープで例外を宣言できます。これを行うと、親スコープにあるものは子スコープ内に表示されなくなります。
例外の発生と処理
SQL スクリプトの BEGIN/END ブロックには、オプションの例外セクションを含めることができます。
構文
BEGIN
... ... ...
EXCEPTION
[WHEN <exceptionName>
[OR <exceptionName> …]
THEN <statements> …]
[ELSE <statements>]
END
備考
| •
|
EXCEPTION ブロックが宣言されている場合、少なくとも 1 つの WHEN または 1 つの ELSE 句が含まれている必要があります。EXCEPTION ブロックには WHEN 句をいくつでも含めることができますが、ELSE 句は 1 つだけです。 |
| •
|
BEGIN/END ブロックで例外が発生すると、例外に一致する最初の例外ハンドラー WHEN 句が実行されます。 |
| •
|
スコープのすべての変数は、例外ハンドラー内で使用できます。この手法は、たとえば Java とは異なります。Java では、TRY ブロックからは何も CATCH ブロックで使用できません。SQL スクリプトでは、BEGIN 領域内で使用可能なすべての変数は、EXCEPTION 領域内で使用できます。それらは、END に到達するまで範囲外になりません。 |
| •
|
例外がブロック内で処理されない場合、そのブロックは LEAVE ステートメントと同様にスコープを離れ、同じ例外が親スコープで発生し、そこで処理できます。それ以上のスコープがない場合、例外はプロシージャから呼び出し元にスローされます。呼び出し元が SQL スクリプトの場合、SQL スクリプトはこのエラーを受け取ります。呼び出し元が JDBC または Java プロシージャである場合、Java 例外が受け取られます。 |
呼び出し元が SQLFROM 句を使用している場合、ステートメントは実行時例外で終了します。
| •
|
例外ハンドラー内で発生した例外は、このスコープ内の未処理の例外であるかのように、現在のスコープをすぐに離れます。 |
| •
|
RAISE ステートメントを使用して、例外を再度発生させます。 |
例
PROCEDURE p (IN x INTEGER, OUT result BIT)
BEGIN
DECLARE illegal_arg_ex EXCEPTION;
...
IF x < 0 THEN
RAISE illegal_arg_ex;
END
SET result = 1; --success
EXCEPTION
WHEN illegal_arg_ex THEN
SET result = 0; --failure
END
外部例外
SQL Script のシステム例外は、グローバルに予約された名前と見なされますが、SQLScript プロシージャによって参照できます。ユーザー定義の例外が公開されている場合は、他のプロシージャで使用できます。
構文
<compNamespacePath>.<exceptionName>
備考
| •
|
スクリプトに TDV ネームスペース パス (<compNamespacePath>) の後にドットと例外名 (<exceptionName>) を含めることにより、SQL スクリプト プロシージャからシステム例外またはその他のパブリック例外を呼び出すことができます。 |
| •
|
Studio の /lib/util/System の [例外] タブで、SQL スクリプト プロシージャで使用できるシステム例外を表示できます。 |
例
/lib/util/System.NotFoundException