использовать mysql для диагностики в другой процедуре

0

Я хочу создать публичную процедуру журнала ошибок. 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
Теги:

1 ответ

0
Лучший ответ

<MySQL 5.7.2

13.6.7.7 Диагностическая область MySQL :: 13.6.7.7.3 Как заполняется область диагностики

...

Операторы SQL очищают и устанавливают область диагностики следующим образом:

  • Когда сервер начинает выполнять инструкцию после его разбора, он очищает область диагностики для недиагностических операторов, которые используют таблицы....

...

См. Db-скрипт.

> = MySQL 5.7.2

13.6.7.7 Диагностическая область MySQL :: 13.6.7.7.3 Как заполняется область диагностики

...

Операторы SQL очищают и устанавливают область диагностики следующим образом:

  • Когда сервер начинает выполнять оператор после его разбора, он очищает область диагностики для недиагностических операторов. (Перед MySQL 5.7.2 сервер очищает область диагностики для недиагностических операторов, которые используют таблицы.)...

...

См. Db-скрипт.

Возможное альтернативное решение (> = 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-скрипт.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню