【问题标题】:In FirebirdSql, how to return exception message from procedure在 FirebirdSql 中,如何从程序返回异常消息
【发布时间】:2013-12-31 13:13:57
【问题描述】:

我想在发生异常时从过程中返回错误消息。在 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 ; ^

【问题讨论】:

  • 你无法捕捉到异常,它会冒泡给调用者。
  • 我想格式化消息和错误代码。它适用于 Intranet Web 应用程序

标签: firebird firebird2.5 firebird2.1


【解决方案1】:

不幸的是,您需要在客户端执行此操作,因为目前无法在 PSQL 中获得此操作。 Firebird tracker中有一个feature request,已经为Firebird 4实现了,预计2019年发布。

请参阅Firebird 4 Beta 2 release notes, section System Function RDB$ERROR()(警告:链接可能会在下一个或 GA 版本时中断):

函数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

【讨论】:

  • 好吧,我当然希望你的答案不是正确的,但既然它是正确的,就目前而言,我要给你功劳
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 2012-08-05
    • 2013-02-01
    • 2022-01-21
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多