我在oracle中创建了函数,我注意到它没有返回/空字符串。
Oracle功能
CREATE OR REPLACE function UDF_GET_STATUS(P_ID in NUMBER)
return NVARCHAR2 is
l_status NVARCHAR2(25);
begin
select case
when exists(select ID, STATUS
from Transaction
where ID = P_ID AND STATUS = 1)
then 'APPROVED'
else 'FOR APPROVAL'
end into l_status
from Transaction WHERE ID = P_ID;
return l_status;
end;
我错过了什么吗?请指教..
谢谢,
答案 0 :(得分:2)
这很可能是因为您没有与您的查询匹配的结果。 Oracle将允许您的函数返回但将返回NULL结果。
在PL / SQL中引发了NO_DATA_FOUND异常,但它并未传播到您的SQL。我猜你传递给你的函数的ID在你的表中不存在。请参阅我的回答here以获得解释。
无论如何,你的功能有点奇怪。您正在对TRANSACTION进行两次扫描,这不是必需的。由于您没有从表中返回任何数据,我将使用聚合查询,该查询总是返回一行,因此不会表现出相同的行为:
create or replace function UDF_GET_STATUS( P_ID in number
) return nvarchar2 is
l_status number;
begin
select count(*) into l_status
from transaction
where id = P_ID
and status = 1
and rownum < 2
;
if l_status = 0 then
return 'FOR APPROVAL';
else return 'APPROVED';
end if;
end;
/
由于您的查询是EXISTS,您只需要一行符合条件,因此您可以使用ROWNUM来限制您可能获得的结果。
你在这里返回一个NVARCHAR2也有点好奇......