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

igetnqfo  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(395)

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

rslzwgfq1#

请考虑以下陈述:

SELECT id INTO v_var
FROM our_table
WHERE id = p_id;

这个循环通过 our_table . 当它找到匹配项时 SELECT 子句并将值放入变量中。唉。没有匹配,没有调用 SELECT --没有任务。
这个 SET 是另一回事:

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

(注意 := 不需要 SET )这是使用标量子查询。标量子查询总是返回一个值。如果子查询返回一行,那么这就是值。如果子查询不返回任何行,则该值为 NULL . 所以, NULL 在这种情况下分配。
换言之,完全没有赋值与赋值给不同 NULL .

相关问题