0

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

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

谢谢,

4

1 回答 1

2

这很可能是由于您没有与您的查询匹配的结果。Oracle 将允许您的函数返回,但将返回 NULL 结果。

在 PL/SQL 中会引发 NO_DATA_FOUND 异常,但不会传播到您的 SQL。我猜您传递给函数的 ID 在您的表中不存在。请在此处查看我的答案以获得解释。

反正你的功能有点奇怪。您正在对 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 也有点好奇......

于 2013-09-02T12:25:08.407 回答