在 EXIT HANDLER 块中,MySQL 的等价物是什么
OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)
ERROR_MESSAGE()
编辑
我想做的事。在 SQL Server 中我有
CREATE PROC ...
AS
SET NOCOUNT, XACT_ABORT ON;
BEGIN TRY
...
END TRY
BEGIN CATCH
ROLLBACK etc
EXEC someGenericProc @@PROCID, @errmsg OUTPUT;
RAISERROR ( @errmsg, 16, 1);
END CATCH
GO
CREATE PROC someGenericProc
@LoggingProcID int
AS
..
SELECT
@LoggingObject = OBJECT_SCHEMA_NAME(@LoggingProcID ) + '.' + OBJECT_NAME(@LoggingProcID),
@ErrorObject = ERROR_PROCEDURE(),
@ErrorMessage = ERROR_MESSAGE();
-- some processing to deal with nesting etc
INSERT SomeErrorTable (...)
VALUES (@LoggingObject, @ErrorObject, @ErrorMessage)
...
GO
干杯
我相信
SIGNAL
(在 MySQL 5.5 中引入)是您想要的,用于自动日志记录。但是,当前的实现不能使用各种条件,例如
SCHEMA_NAME
在 SIGNAL 执行之后:唯一可用的信息是
MYSQL_ERRNO
andMESSAGE_TEXT
,所以如果你想要 schema_name,你必须将它包含在你的MESSAGE_TEXT
.从SIGNAL/RESIGNAL 工作日志更新
因此,您可以将信号设置为:
SIGNAL SQLSTATE '22012' SET MYSQL_ERRNO=1365, MESSAGE_TEXT='Division by 0'
显式,但它不会仅从 sqlstate 自动继承文本和错误编号。警告:我能够使用 RESIGNAL 获得一些错误信息。考虑一下:
然而有了这个:
从RESIGNAL 文档中找到的示例(稍作修改)
更新2
唉,现在还不能创建一个通用的异常处理程序。这是一个 6 年前的功能请求:http ://bugs.mysql.com/bug.php?id=11660
(相对)好消息是,修复是创建查看诊断堆栈的能力。这很好,因为此功能的先决条件是上面提到的 SIGNAL/RESIGNAL。不好的部分是诊断堆栈的工作日志尚未公开可见。
因此,现在您必须为您的过程将遇到的每个状态创建一个异常处理程序以登录到表中,并且只记录错误号(硬编码,因为处理程序不可用),也许是硬-编码的消息文本。