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 の使用法 » ストアド・プロシージャとトリガ » プロシージャ、トリガ、バッチの使用 » プロシージャとトリガでのエラーと警告

 

プロシージャとトリガでのデフォルトのエラー処理

この項では、プロシージャ内にエラー処理を指定しなかった場合に、SQL Anywhere がエラーを処理する方法を説明します。

さまざまな動作にプロシージャとトリガでの例外ハンドラの使用で説明する例外ハンドラを使用できます。

警告の処理はエラーの処理とは少し異なります。詳細については、プロシージャとトリガでのデフォルトの警告処理を参照してください。

エラーを処理するには、特に指定しないかぎり次の 2 通りの方法があります。

  • デフォルトのエラー処理   プロシージャかトリガがエラーを起こしたときに、呼び出しを行った環境にエラー・コードが返されます。

  • ON EXCEPTION RESUME   CREATE PROCEDURE 文に ON EXCEPTION RESUME 句が含まれていれば、プロシージャはエラーを起こした箇所の次の文から実行を再開します。

    ON EXCEPTION RESUME を使用するプロシージャの正確な動作は、on_tsql_error オプション設定によって指定します。on_tsql_error オプション [互換性]を参照してください。

デフォルトのエラー処理

通常、プロシージャまたはトリガの SQL 文がエラーを起こすと、そのプロシージャまたはトリガは実行を停止し、SQLCODE と SQLSTATE に適切な値が入った状態でアプリケーションに制御が戻されます。これは最初の文がエラーを起こしたときも同じです。トリガの場合は、トリガを起動した操作も取り消され、アプリケーションにエラーが返されます。

次の例のプロシージャは、アプリケーションからプロシージャ OuterProc を呼び出し、OuterProc が 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 'SQLSTATE set to ',
      SQLSTATE, ' in InnerProc.' TO CLIENT;
END;

CALL OuterProc();

Interactive SQL の [メッセージ] タブに次のメッセージが表示されます。

Hello from OuterProc.
Hello from InnerProc.

InnerProc 内の DECLARE 文は、サーバが認識しているエラー条件に関連して事前に定義された SQLSTATE 値のうち、1 つの記号名を宣言します。

MESSAGE 文は Interactive SQL の [メッセージ] タブにメッセージを送ります。

SIGNAL 文は InnerProc プロシージャ内から、エラーであることを外部に知らせる役割を持ちます。

InnerProc の SIGNAL 文の後の文は実行されず、InnerProc はすぐに呼び出しを行った環境 (この場合はプロシージャ OuterProc) に制御を戻します。OuterProc の CALL 文の後に続く文は実行されません。エラーは呼び出しを行った環境に戻され、処理されます。たとえば、Interactive SQL はエラー・メッセージをメッセージ・ウィンドウに表示してエラーの処理を行います。

TRACEBACK 関数はエラーが起きたときに実行していた文をリストします。Interactive SQL から TRACEBACK を使うには、次の文を入力します。

SELECT TRACEBACK();