mysql - 在另一个过程中使用 mysql 获取诊断

标签 mysql

我想建立一个公共(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/

相关文章:

mysql - 在 sql 更新查询中加入字符串

javascript - 使用来自多个其他行的值创建一个表行

Mysql多行请求

mysql - 在 MySQL 中将字符转换为 UTF8(É 到 é)

在 LEFT JOIN 中使用变量作为表名的 MYSQL 查询

MySQL语法错误异常 : Error while upgrading MySQL version

python - 如何使用 SQLALchemyJobStore 保存 python Apscheduler

子字符串不循环的 MySQL GROUP BY

java.sql.SQLException : Access denied for user 'root@localhost' @'localhost' (using password: YES) 异常

mysql - 从mysql索引中获取基数可能性