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

标签 mysql stored-procedures percona

我使用 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/

相关文章:

MySQL 子查询

c# - 如何调用返回带空格的列的存储过程

Mysql 不正确的优化器工作

java - 无法从 Java 执行 MySQL 存储过程

MySQL/InnoDB偶尔有些更新运行很慢,处于 'Updating'状态

mysql - 如何将 InnoDB 表移动到另一个驱动器?

java - JComboBox 使用 DefaultComboBoxModel 修改索引

php - 更改 ShareJS 中的默认文本

php - 使用 codeigniter 在表单上显示每个数据

mysql - 存储过程中的语法错误