在Oracle函数中没有返回任何内容

时间:2013-09-02 12:17:01

标签: oracle function stored-procedures oracle11g oracle10g

我在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;

我错过了什么吗?请指教..

谢谢,

1 个答案:

答案 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也有点好奇......