我使用 Percona Server 5.6.26-74.0 并且我有一个存储过程 SHOW ERRORS 语句在其中。它似乎不能在存储过程内部工作,但在以临时方式外部调用时可以工作。我最近升级到了这个特定版本的 Percona Server。在我以前的版本中它运行得很好。有谁知道为什么这不起作用,是否有任何解决方法可以在存储过程中获得显示错误的相同工作行为?
完成 SIGNAL 的主要存储过程是这样的。该信号被发送到存储过程的调用者。
CREATE PROCEDURE `X`( IN in_a CHAR(64), IN in_b TINYINT )
BEGIN
DECLARE c_invalidState CONDITION FOR SQLSTATE '40031';
DECLARE EXIT HANDLER FOR c_invalidState
BEGIN
RESIGNAL;
END;
IF in_b = 0
THEN
SIGNAL c_invalidState
SET MESSAGE_TEXT = 'Invalid state Error.';
END IF;
END
现在我有另一个存储过程(将其视为 UT sp),它在主存储过程中查找特定的 MESSAGE_TEXT 集。
CREATE PROCEDURE sp_ut_x()
BEGIN
DECLARE c_invalidStateUT CONDITION FOR SQLSTATE '40031';
DECLARE CONTINUE HANDLER FOR c_invalidStateUT select "Ignoring expected 40031 exception";
CALL X('2322',0);
SHOW ERRORS;
END
此处调用的 SHOW ERRORS 始终返回空集。它曾经在 percona 更新之前工作。
最佳答案
请参阅 MySQL 手册页 SHOW ERRORS
,诊断调用。
在下面我创建了一个退出处理程序。存储过程的主要部分将会出错。请注意命令的 OUT
参数和 IN
参数。
DROP PROCEDURE IF EXISTS force_An_Error;
DELIMITER $$
create procedure force_An_Error
( OUT errorOccurred int,
IN todo int -- this is the command. 1 means Force An Error
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET errorOccurred=1;
SHOW ERRORS;
END;
-- The real part of my stored proc is here. Error Handler is above
IF todo=1 THEN
select 555xxNonsense; -- force an error !
END IF;
SET errorOccurred=0; -- All is fine
select 7 as seven; -- This is fine (By the way I never get here)
END$$
DELIMITER ;
测试:
set @testvar:=0;
call force_An_Error(@test,1);
+-------+------+------------------------------------------------+
| Level | Code | Message |
+-------+------+------------------------------------------------+
| Error | 1054 | Unknown column '555xxNonsense' in 'field list' |
+-------+------+------------------------------------------------+
call force_An_Error(@test,0);
+-------+
| seven |
+-------+
| 7 |
+-------+
MySQL 社区服务器 5.6.24
关于mysql - "SHOW ERRORS"在存储过程中不起作用(Percona Server 5.6.26-74.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38624663/