我在mysql中有一个存储过程(5.7.22)
我有一个声明的局部变量。
我的理解是,我可以设置它的几种方式,包括'设置'和'选择进入'。 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 ;
1条答案
按热度按时间rslzwgfq1#
请考虑以下陈述:
这个循环通过
our_table
. 当它找到匹配项时SELECT
子句并将值放入变量中。唉。没有匹配,没有调用SELECT
--没有任务。这个
SET
是另一回事:(注意
:=
不需要SET
)这是使用标量子查询。标量子查询总是返回一个值。如果子查询返回一行,那么这就是值。如果子查询不返回任何行,则该值为NULL
. 所以,NULL
在这种情况下分配。换言之,完全没有赋值与赋值给不同
NULL
.