MySQL, хранимая процедура, несоответствие, настройка локальной переменной - PullRequest
0 голосов
/ 09 октября 2018

У меня есть хранимая процедура в 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 ;

1 Ответ

0 голосов
/ 09 октября 2018

Рассмотрим это утверждение:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...