"SHOW ERRORS" 在存储过程中不起作用(Percona Server 5.6.26-74.0)

"SHOW ERRORS" does not work inside stored procedure ( Percona Server 5.6.26-74.0 )

我使用 Percona Server 5.6.26-74.0 并且我有一个存储过程 SHOW ERRORS 声明在里面。它似乎在存储过程内部不起作用,但在以临时方式在外部调用时起作用。我最近升级到这个特定版本的 Percona Server。它在我以前的版本中运行良好。有谁知道为什么这不起作用,是否有任何变通方法可以在存储过程中获得 SHOW ERRORS 的相同工作行为?

完成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 总是返回空 set.It 用于在 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