У меня есть хранимая процедура в MySQL (5.7.22)
У меня есть объявленная локальная переменная.
Насколько я понимаю, я могу установить ее несколькими способами, включая «SET» и«SELECT INTO».
SET
дает ожидаемые результаты, устанавливает локальную переменную, в данном случае NULL, которая запускает обработчик выхода.
SELECT INTO
не производитрезультат ожидаю.Кажется, он не имеет значения NULL, поэтому обработчик выхода никогда не сигнализируется.
Что действительно странно для меня, так это то, что окончательный SIGNAL SQLSTATE '45000'
даже не запускается в примере 2.
Чего мне не хватает?
Спасибо
DELIMITER $$
CREATE PROCEDURE `test_proc`(IN p_id INT)
BEGIN
DECLARE v_var INT DEFAULT NULL;
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
RESIGNAL;
END;
/* Example 1 - works as expected */
SET v_var := (SELECT `id` FROM our_table WHERE `id` = p_id);
/* this is triggered */
IF(v_var IS NULL) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Not found';
END IF;
-- comment out above to run example 2
/* Example 2 - Does not work as expected */
SELECT `id` INTO v_var FROM our_table WHERE `id`=p_id;
/* this is not triggered */
IF(v_var IS NULL) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Not found';
END IF;
/* in fact - this is not triggered either... */
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Not found';
END$$
DELIMITER ;