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

ede*_*son 7 firebird firebird2.1 firebird2.5

我想在发生异常时从过程返回错误消息.在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 ; ^
Run Code Online (Sandbox Code Playgroud)

Mar*_*eel 5

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

请参阅Firebird 4 Alpha 1发行说明的“ 系统功能RDB $ ERROR()”部分(警告:在下一个Alpha版本中,链接可能会中断):

该函数RDB$ERROR()将PSQL错误上下文作为输入,并返回活动异常的特定上下文。它的范围仅限于PSQL中异常处理块的上下文。在异常处理块之外,RDB$ERROR始终包含 NULL

返回值的类型取决于上下文。

语法规则

RDB$ERROR ( context )
context ::= { GDSCODE | SQLCODE | SQLSTATE | EXCEPTION | MESSAGE }
Run Code Online (Sandbox Code Playgroud)

[..]

BEGIN
  ...
WHEN ANY DO
  EXECUTE PROCEDURE P_LOG_EXCEPTION(RDB$ERROR(MESSAGE));
END
Run Code Online (Sandbox Code Playgroud)