oracle函数中的Nullable返回类型

时间:2015-04-22 09:03:09

标签: oracle function plsqldeveloper

是否可以从oracle函数返回null?

我有以下oracle函数:

create or replace function vta.GetAmount(p_month NUMBER)
  return number is
  v_amount number(9);
begin
  select amount
    into v_amount
    from salary
   where salary.month = p_month;
  return v_amount;
end GetAmount;

当select语句返回零行时,会引发以下异常: ora-01403: no data found

在这种情况下,我希望函数返回null。

3 个答案:

答案 0 :(得分:4)

create or replace function vta.GetAmount(p_month NUMBER)
  return number is
  v_amount number(9);
begin
  select amount
    into v_amount
    from salary
   where salary.month = p_month;
  return v_amount;
  exception   -- code to handle no data
  when no_data_found then
  return null;
  end GetAmount;

答案 1 :(得分:3)

当您在PL / SQL中执行非批量隐式游标时(这是您使用SELECT ... INTO ...完成的),您必须记住它至少需要1行,最多1行行。

如果你得到的行少于或多于1行,你将得到一个例外 - NO_DATA_FOUND或TOO_MANY_ROWS,两者都是不言自明的。

如果您希望代码在发生任何异常时执行某些操作,那么您将需要处理这些异常。

例如:

create or replace function vta.GetAmount(p_month NUMBER)
  return number is
  v_amount number(9);
begin
  select amount
    into v_amount
    from salary
   where salary.month = p_month;
  return v_amount;
exception
  when no_data_found then
    return null;
  when too_many_rows then
    return null;
end GetAmount;

答案 2 :(得分:0)

如果您确实知道/想要总是返回一行,则可以将您的选择更改为select nvl(sum(amount),0)

  1. sum确保您总是获得1行,因为您没有分组
  2. 如果找不到任何内容,
  3. nvl会将null替换为0
  4. 请注意,如果有多个匹配行,您将得到所有匹配行的总和。