在FirebirdSql中,如何从过程中返回异常消息



当发生异常时,我想从过程中返回错误消息。在SQL Server中,您可以选择Error_Number()和Error_Message()。如何在FirebirdSql 中执行

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 ; ^

不幸的是,您需要在客户端执行此操作,因为目前无法在PSQL中获得此操作。火鸟跟踪器中有一个功能请求,该请求已在火鸟4中实现,预计将于2019年发布。

请参阅Firebird 4发行说明,系统函数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
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

最新更新