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

标签 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
//

基本上,运行一个查询,如果没有返回任何内容(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/

相关文章:

mysql - SQL Server - (AdventureWorks) 列出没有产品的供应商

mysql - SQL复杂连接查询

mysql - 在 MySQL 中加载数据 Infile 问题(不正确的字符串值错误)

mysql存储过程查询建议

java - 插入与 Hibernate 映射的存储过程

hibernate - 如何使用 Hibernate 执行多返回类型 Oracle 过程?

mysql - 如何选择具有偏移量的特定行

MySQL查询获取日期+时间比现在更晚的记录?

mysql - 如何在 MySQL 中检索节点的子节点和孙节点?

visual-studio-2010 - Visual Studio 2010 : How to change stored procedure template