リファレンスガイド> TDV SQLスクリプト> SQLスクリプトの手順と構造> 例外
 
例外
SQLスクリプトで例外を定義するには、例外に一意の名前を指定し、その名前のプロシージャを定義して例外条件を処理します。
CURRENT_EXCEPTIONの属性
例外の発生と処理
外部例外
構文
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>)。
Studioの/lib/util/Systemの[例外]タブで、SQLスクリプトプロシージャで使用できるシステム例外を表示できます。
/lib/util/System.NotFoundException