エラーは呼び出しを行った環境へ戻すよりも、プロシージャーまたはトリガーの内部で捕捉して処理した方が良い場合があります。これは「例外ハンドラー」を使用して行います。
例外ハンドラーは、複合文の EXCEPTION 部分で定義します。
複合文でエラーが起きた場合、例外ハンドラーが実行されます。警告では、例外ハンドラーは実行されません。ネストされた複合文の中でエラーが起きた場合、また、複合文の中から起動されたプロシージャーやトリガーの中でエラーが起きた場合は、例外処理コードが実行されます。
中断エラー SQL_INTERRUPT、SQLSTATE 57014 の例外ハンドラーには、ROLLBACK や ROLLBACK TO SAVEPOINT などの中断のできない文だけを含めます。例外ハンドラーに、接続の中断時に呼び出される中断可能な文を含めると、データベースサーバーは最初の中断可能な文で例外ハンドラーを停止し、中断エラーを返します。
例外ハンドラーでは、文が失敗した原因を判断するために、SQLSTATE または SQLCODE 特別値を使用できます。代わりに、ERRORMSG 関数を引数なしで使用すると、SQLSTATE に関連付けられたエラー条件が返されます。この情報を指定できるのは、各 WHEN 句の最初の文のみであり、文は複合文にはできません。
次に示す例では、デフォルトのエラー処理で使用したプロシージャーを基にして、例外ハンドラーの処理を示します。
この例では、InnerProc プロシージャーで見つからないカラムに関するエラーを処理するために、コードが追加されています。
DROP PROCEDURE OuterProc; DROP PROCEDURE InnerProc; CREATE PROCEDURE OuterProc() BEGIN MESSAGE 'Hello from OuterProc.' TO CLIENT; CALL InnerProc(); MESSAGE 'SQLSTATE set to ', SQLSTATE,' in OuterProc.' TO CLIENT END; CREATE PROCEDURE InnerProc() BEGIN DECLARE column_not_found EXCEPTION FOR SQLSTATE '52003'; MESSAGE 'Hello from InnerProc.' TO CLIENT; SIGNAL column_not_found; MESSAGE 'Line following SIGNAL.' TO CLIENT; EXCEPTION WHEN column_not_found THEN MESSAGE 'Column not found handling.' TO CLIENT; WHEN OTHERS THEN RESIGNAL ; END; CALL OuterProc(); |
Interactive SQL の [メッセージ] タブに、次のメッセージが表示されます。
Hello from OuterProc. Hello from InnerProc. Column not found handling. SQLSTATE set to 00000 in OuterProc. |
EXCEPTION 句は例外ハンドラーを宣言します。これ以降の文はエラーが起きないかぎり実行されません。WHEN 句は例外名 (DECLARE 文で宣言) と、その例外が起こったときに実行する文を定義します。WHEN OTHERS THEN 句はその前の WHEN 句以外で例外が起こったときに実行する文を定義します。
上の例では、RESIGNAL は例外を上位レベルの例外ハンドラーに渡します。WHEN OTHERS THEN が例外ハンドラー中に定義されていない場合は、RESIGNAL がデフォルト処理になります。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |