MySQL存储函数,如何检查没有行而不生成警告?

Ano*_*nym 2 mysql stored-procedures

我有这个功能:

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
//
Run Code Online (Sandbox Code Playgroud)

基本上,运行一个查询,如果没有返回任何内容(a.id被声明为NOT NULL),则运行另一个查询并返回链接ID.如果找不到,则linkId将为NULL,如果找不到pc1,则返回NULL即可.

这有效,但如果第一个查询没有返回任何内容,则会发出警告:

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)
Run Code Online (Sandbox Code Playgroud)

运行一个查询的正确方法是什么,如果没有返回任何内容,请运行另一个查询?

Ike*_*ker 7

您可以使用a 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
//
Run Code Online (Sandbox Code Playgroud)