我想建立一个公共(public)错误日志程序。 mysql 5.7.2 我尝试在同一过程中使用 get 条件,有效。 我记得这种方法以前有效,可能是旧的mysql版本,或者我更改了设置。现在,@errNo、@errMsg 始终为 NULL。
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_err_log`()
BEGIN
GET DIAGNOSTICS @cno = NUMBER;
GET DIAGNOSTICS CONDITION 1 @errNo = MYSQL_ERRNO, @errMsg = MESSAGE_TEXT;
SELECT @errNo, @errMsg;
END
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_test`()
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
CALL sp_err_log();
END;
select 1;
select * from tbl_not_exist;
select 2;
END
最佳答案
13.6.7.7 The MySQL Diagnostics Area :: 13.6.7.7.3 How the Diagnostics Area is Populated
...
SQL statements clear and set the diagnostics area as follows:
- When the server starts executing a statement after parsing it, it clears the diagnostics area for nondiagnostic statements that use tables. ...
...
参见db-fiddle .
>= MySQL 5.7.2
13.6.7.7 The MySQL Diagnostics Area :: 13.6.7.7.3 How the Diagnostics Area is Populated
...
SQL statements clear and set the diagnostics area as follows:
- When the server starts executing a statement after parsing it, it clears the diagnostics area for nondiagnostic statements. (Before MySQL 5.7.2, the server clears the diagnostics area for nondiagnostic statements that use tables.) ...
...
参见db-fiddle .
可能的替代解决方案(>= MySQL 5.7.2):
DELIMITER //
CREATE PROCEDURE `sp_err_log`(
`_MYSQL_ERRNO` INT,
`_MESSAGE_TEXT` TEXT
)
BEGIN
SELECT
`_MYSQL_ERRNO`,
`_MESSAGE_TEXT`;
END//
CREATE PROCEDURE `sp_test`()
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
DECLARE
`_NUMBER`,
`_MYSQL_ERRNO` INT;
DECLARE
`_MESSAGE_TEXT` TEXT;
GET STACKED DIAGNOSTICS `_NUMBER` = NUMBER;
GET STACKED DIAGNOSTICS CONDITION `_NUMBER`
`_MYSQL_ERRNO` = MYSQL_ERRNO,
`_MESSAGE_TEXT` = MESSAGE_TEXT;
CALL `sp_err_log`(
`_MYSQL_ERRNO`,
`_MESSAGE_TEXT`
);
END;
SELECT 1;
SELECT NULL
FROM `tbl_not_exist`;
SELECT 2;
END//
DELIMITER ;
参见db-fiddle .
关于mysql - 在另一个过程中使用 mysql 获取诊断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47839624/