是否可以从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。
答案 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)
sum
确保您总是获得1行,因为您没有分组nvl
会将null
替换为0
请注意,如果有多个匹配行,您将得到所有匹配行的总和。