gpt4 book ai didi

MySQL,存储过程,差异设置局部变量

转载 作者:行者123 更新时间:2023-11-29 06:38:34 24 4
gpt4 key购买 nike

我在 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 ;

最佳答案

考虑这个陈述:

SELECT id INTO v_var
FROM our_table
WHERE id = p_id;

这会循环遍历our_table。当找到匹配项时,then 将调用 SELECT 子句并将值放入变量中。唉。没有匹配,没有调用SELECT——也没有赋值。

SET 是一个不同的故事:

SET v_var = (SELECT `id` FROM our_table WHERE `id` = p_id);

(请注意,SET 不需要 :=。)这使用了标量子查询。标量子查询始终返回一个值。如果子查询返回一行,那么这就是值。如果子查询没有返回任何行,则值为NULL。因此,在本例中分配了 NULL

换句话说,根本不赋值NULL 的赋值不同。

关于MySQL,存储过程,差异设置局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52711201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com