Сохраненная функция MySQL, как проверить отсутствие строк и не генерировать предупреждение? - PullRequest
2 голосов
/ 01 декабря 2010

У меня есть эта функция:

DROP FUNCTION IF EXISTS find_linkid;
DELIMITER //
CREATE FUNCTION `find_linkid`(pc1 VARCHAR(50)
    RETURNS INT
BEGIN
    DECLARE linkId int;
      SELECT a.id INTO linkId FROM PC_A a WHERE a.pc=pc1;
ON         
    IF linkId IS NULL THEN
        SELECT b.id INTO linkId FROM PC_B b WHERE b.pc=pc1;
    END IF;

    RETURN linkId;
END
//

По сути, запустите один запрос, если он ничего не возвращает (a.id объявлен как NOT NULL), запустите другой запрос и верните идентификатор ссылки. Если это также не найдено, linkId будет НЕДЕЙСТВИТЕЛЬНЫМ, возвращая НЕДЕЙСТВИТЕЛЬНЫЙ, если pc1 вообще не найден, в порядке.

Это работает, но выдает предупреждения, если первый запрос ничего не возвращает:

select find_linkid('12BD');
+------------------------------+
| find_linkid('12BD')          |
+------------------------------+
|                          667 |
+------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+-----------------------------------------------------+
| Level   | Code | Message                                             |
+---------+------+-----------------------------------------------------+
| Warning | 1329 | No data - zero rows fetched, selected, or processed |
+---------+------+-----------------------------------------------------+
1 row in set (0.00 sec)

Как правильно выполнить один запрос, если он ничего не возвращает, запустить другой запрос?

Ответы [ 3 ]

7 голосов
/ 01 декабря 2010

Вы можете использовать CONTINUE HANDLER, чтобы перехватить предупреждение, а затем установить переменную, если хотите, или просто проигнорировать ее, задав CONTINUE HANDLER пустое тело.

Вот пример для подавленияпредупреждение (я также исправил недостающие скобки и удалил постороннее ON из вашего кода):

DROP FUNCTION IF EXISTS find_linkid;
DELIMITER //
CREATE FUNCTION `find_linkid`(pc1 VARCHAR(50))
    RETURNS INT
BEGIN
 DECLARE linkId int;
 DECLARE CONTINUE HANDLER FOR NOT FOUND BEGIN END;
      SELECT a.id INTO linkId FROM PC_A a WHERE a.pc=pc1;
    IF linkId IS NULL THEN
        SELECT b.id INTO linkId FROM PC_B b WHERE b.pc=pc1;
    END IF;

    RETURN linkId;
END
//
4 голосов
/ 11 июня 2014

Вот еще одна возможность с меньшим количеством шаблонов:

DECLARE _found, _id integer;
SELECT count(*), sum(a.id) INTO _found, _id FROM PC_A AS a WHERE a.pc = pc1;
IF _found THEN RETURN _id; END IF;
SELECT b.id INTO _id FROM PC_B AS b WHERE b.pc = pc1;
RETURN _id;
3 голосов
/ 01 декабря 2010

Попробуйте этот обработчик:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET linkId = NULL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...