未找到匹配记录时返回 NULL

Posted

技术标签:

【中文标题】未找到匹配记录时返回 NULL【英文标题】:Return NULL when no matching records are found 【发布时间】:2013-09-03 07:05:53 【问题描述】:

我将员工编号传递给函数并返回加入日期。

当没有找到匹配的记录时,我希望它返回 NULL;就我而言,它只是返回空白或空行;

get_join_date(in_emp_no)

CREATE OR REPLACE FUNCTION get_join_date(in_emp_no) RETURN DATE IS
  v_join_date DATE;
  BEGIN
    SELECT joined_date
    INTO v_date
    FROM employee
    WHERE employee_number = in_emp_no
          AND type = in_type;

    IF v_join_date IS NOT NULL        THEN
      v_join_date := v_date;
    ELSE
      v_join_date = NULL;
    END IF;

    RETURN v_join_date;
  END;

【问题讨论】:

每次想要获取数据时都运行 select 并不是最好的主意。创建集合,填充它,然后从集合中获取值。集合是基于会话级别的,因此您可以从任何地方访问它... 【参考方案1】:

如果没有找到匹配的记录,则会引发 NO_DATA_FOUND 异常;你必须捕获这个异常并返回一些东西。

您还要检查v_join_date 是否为空,如果为空,则为其分配一个空值;没有必要这样做。

create or replace function get_join_date( 
      Pemp_no in number
     ) return date is

   l_join_date date;

begin

   select joined_date into l_join_date 
     from employee
    where employee_number = Pemp_no
      and type = in_type;

   return l_join_date;

exception when no_data_found then
   return null;

end;

其他错误包括:

    您正在选择v_date,但您将变量声明为v_join_date end 语句后没有分号。 endif 语句后没有分号。 endif是两个字,应该是end if; 您没有声明您需要的参数in_emp_no 的数据类型(但不是长度),例如... function get_join_date ( Pemp_no number ) ...

【讨论】:

【参考方案2】:

当您想要返回一个现有值或 null 时,您可以简单地使用聚合函数,例如MIN,为此:

CREATE OR REPLACE FUNCTION get_join_date( in_emp_no) RETURN DATE
IS
  v_join_DATE DATE;
BEGIN
  SELECT MIN(JOINED_DATE)
    INTO v_join_DATE 
    FROM employee
   WHERE employee_number = in_emp_no
     AND TYPE=in_type;
  return v_join_DATE;
end

【讨论】:

以上是关于未找到匹配记录时返回 NULL的主要内容,如果未能解决你的问题,请参考以下文章

当未找到结果时,其中 First() 似乎返回 null 的 Linq 查询

未找到记录时,mysqli_query 不返回 false [重复]

当要求更新未找到或未更新的记录时,应该将http返回给客户端的内容是什么?

未找到匹配项时 JPA 查询的返回值

未保存的关联模型类一直返回 null

从匹配记录中返回特定字段