Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.1 » SQL Anywhere サーバー SQL の使用法 » ストアドプロシージャー、トリガー、バッチ、ユーザー定義関数 » エラーと警告の処理

 

例外ハンドラー

エラーは呼び出しを行った環境へ戻すよりも、プロシージャーまたはトリガーの内部で捕捉して処理した方が良い場合があります。これは「例外ハンドラー」を使用して行います。

例外ハンドラーは、複合文の 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 がデフォルト処理になります。

 追加の注意事項
 例外処理とアトミックな複合文
 参照