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

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » ストアド・プロシージャとトリガ » プロシージャ、トリガ、バッチの使用 » プロシージャとトリガでのエラーと警告

 

プロシージャとトリガでの例外ハンドラの使用

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

例外ハンドラは、複合文の EXCEPTION 部分で定義します。複合文の使用を参照してください。

複合文でエラーが起きた場合、例外ハンドラが実行されます。警告では、例外ハンドラは実行されません。ネストされた複合文の中でエラーが起きた場合、また、複合文の中から起動されたプロシージャやトリガの中でエラーが起きた場合は、例外処理コードが実行されます。

中断エラー SQL_INTERRUPT、SQLSTATE 57014 の例外ハンドラには、ROLLBACK や ROLLBACK TO SAVEPOINT などの中断のできない文だけを含めます。例外ハンドラに、接続の中断時に呼び出される中断可能な文を含めると、データベース・サーバは最初の中断可能な文で例外ハンドラを停止し、中断エラーを返します。

次に示す例では、プロシージャとトリガでのデフォルトのエラー処理で使用したプロシージャを基にして、例外ハンドラの処理を示します。

この例では、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 がデフォルト処理になります。

追加の注意事項
  • InnerProc の SIGNAL 文に続く行ではなく、EXCEPTION ハンドラが実行されます。

  • カラムが見つかりません。」というエラーが発生したため、エラー処理のための MESSAGE 文が実行され、SQLSTATE は 0 にリセットされます (エラーは起こらなかったことを示します)。

  • 例外処理コードが実行された後、制御は OuterProc に戻され、OuterProc はエラーがなかったかのように前へ進みます。

  • ON EXCEPTION RESUME は指定した例外処理とは一緒に使えません。ON EXCEPTION RESUME が含まれていると、例外処理コードは実行されません。

  • カラムが見つかりません。」という例外に対するエラー処理コードが単なる RESIGNAL 文である場合、制御は OuterProc に戻され、SQLSTATE の値は 52003 に設定されたままになります。これは、InnerProc にはエラー処理コードがないのと同じです。OuterProc にはこれ以外のエラー処理コードはないため、プロシージャはエラーになります。

例外処理とアトミックな複合文

例外が複合文内で処理されるとき、複合文はアクティブな例外なしで完了し、例外より前の変更は取り消されません。これはアトミックな複合文でも同じです。アトミックな複合文の中でエラーが発生し、明示的に処理されると、アトミックな複合文内の一部の文は実行されます。