2013-12-12 9 views
5

例外が発生したときに、プロシージャからエラーメッセージを返したいとします。 SQL Serverでは、Error_Number()とError_Message()を選択します。私はFirebirdSqlFirebirdSqlで、プロシージャから例外メッセージを返す方法

SET TERM^; 

CREATE PROCEDURE sprocname 
(id int) 
RETURNS 
(gcode int, errmsg varchar(250)) 
AS 
BEGIN 
    gcode = 0; 
    errmsg = ''; 
    -- do procedure code here 


    WHEN ANY DO 
    BEGIN 
    gcode = gdscode; -- ?? 
    errmsg = ??; 
    END 
    SUSPEND; 
END^ 

SET TERM ;^
+0

あなたは可能性があり、単純ではないCA例外が発生すると、呼び出し元にバブルが発生します。 –

+0

メッセージとエラーコードの書式を設定します。 – edepperson

答えて

4

でそれをどのように行うだろう、PSQLでこれを取得することはできないので残念ながら、あなたは、クライアント側でそれを行う必要があります。

:2017年

にリリースされることが予想されるFirebirdの4のために実装されたFirebirdのトラッカー、中feature requestFirebird 4 Alpha 1 release notes, section System Function RDB$ERROR()(:リンクは次のアルファリリースを壊すかもしれない警告)を参照してくださいがあります

関数RDB$ERROR()はPSQLエラーコンテキストを入力として受け取り、 はアクティブ例外の特定のコンテキストを返します。スコープは で、PSQLの例外処理ブロックのコンテキストに限定されています。 例外処理ブロックの外側には、RDB$ERRORには常に NULLが含まれています。

戻り値の型はコンテキストによって異なります。

構文規則

RDB$ERROR (context) 
context ::= { GDSCODE | SQLCODE | SQLSTATE | EXCEPTION | MESSAGE } 

[..]

BEGIN 
    ... 
WHEN ANY DO 
    EXECUTE PROCEDURE P_LOG_EXCEPTION(RDB$ERROR(MESSAGE)); 
END 
+0

イントラネットのWebアプリケーションのためにそれは正解ではないことを願っていますが、それ以来、私はあなたのためにそれを信用するつもりです – edepperson

0
CREATE PROCEDURE ADD_COUNTRY (
    ACountryName COUNTRYNAME, 
    ACurrency VARCHAR(10)) 
AS 
BEGIN 
    INSERT INTO country (country, 
         currency) 
    VALUES (:ACountryName, 
      :ACurrency); 
    WHEN ANY DO 
    BEGIN 
     -- write an error in log 
    IN AUTONOMOUS TRANSACTION DO 
     INSERT INTO ERROR_LOG (PSQL_MODULE, 
          GDS_CODE, 
          SQL_CODE, 
          SQL_STATE) 
     VALUES ('ADD_COUNTRY', 
       GDSCODE, 
       SQLCODE, 
       SQLSTATE); 
    -- Re-throw exception 
    EXCEPTION; 
    END 
END 

http://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql-handleexceptions.html

関連する問題