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)
运行一个查询的正确方法是什么,如果没有返回任何内容,请运行另一个查询?
您可以使用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)
| 归档时间: |
|
| 查看次数: |
13206 次 |
| 最近记录: |