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