我有这个功能:
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),则运行另一个查询并返回链接 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)
运行一个查询的正确方法是什么,如果没有返回任何内容,运行另一个查询?
最佳答案
您可以使用 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
//
关于MySQL存储函数,如何检查没有行而不产生警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4324976/