我想在发生异常时从过程返回错误消息。在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 ; ^
答案 0 :(得分:4)
不幸的是,您需要在客户端执行此操作,因为目前无法在PSQL中获取此信息。 Firebird跟踪器中有一个feature request,已经为Firebird 4实现,预计将于2017年发布。
请参阅Firebird 4 Alpha 1 release notes, section System Function RDB$ERROR()(警告:链接可能会破坏下一个alpha版本):
函数
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
答案 1 :(得分: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