Задавайте вопросы, мы ответим
Вы не зашли.
данный код проходит успешно на сервере с версией 5.0.22
и генерирует ошибку на сервере 5.0.44 - "ERROR 1308 (42000) at line 8: LEAVE with no matching label: main"
как я понимаю сервер не видит метку main: но почему это зависит от версии?
Может кто знает в чем дело?
create database tst;
use tst;
DELIMITER $$
DROP PROCEDURE IF EXISTS `tst`.`sp_tst`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_tst`(
IN in_id INT,
OUT out_ret_val INT,
OUT out_err_desc varchar(255) #Upon failure will contain error textual description.
)
COMMENT 'test SP'
main: BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET out_err_desc = CONCAT(out_err_desc, ' SQLEXCEPTION occured.');
LEAVE main;
END;
DECLARE EXIT HANDLER FOR SQLWARNING
BEGIN
SET out_err_desc = CONCAT(out_err_desc, ' SQLWARNING occured.');
LEAVE main;
END;
DECLARE EXIT HANDLER FOR NOT FOUND
BEGIN
SET out_err_desc = CONCAT(out_err_desc, ' NOT FOUND.');
LEAVE main;
END;
SET out_err_desc = 'OK.';
SET out_ret_val = 0;
END$$
DELIMITER ;
Неактивен
Сервер обижается на то, что Вы определяете обработчик типа EXIT, т.е. в процедуру
он уже никогда не вернется. Как следствие, метки main в его контексте действительно
нету. Почему сменился контекст - это вопрос скорее к разработчикам MySQL. Думаю,
в данном случае ошибка должна быть, хотя, возможно, ее следует пояснять подробнее.
P.S.
Проверил также на CONTINUE HANDLER - в этом случае, как и ожидалось, ошибки нет.
Неактивен
кажется понял, таким образом я делал масло масленое. спасибо.
Неактивен