【问题标题】:Returning Nothing in Oracle Function在 Oracle 函数中不返回任何内容
【发布时间】:2013-09-05 13:18:26
【问题描述】:

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

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

谢谢,

【问题讨论】:

    标签: oracle function stored-procedures oracle11g oracle10g


    【解决方案1】:

    这很可能是因为您没有与您的查询匹配的结果。 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 也有点好奇......

    【讨论】:

    • 这很奇怪.. 它也没有返回任何内容/空字符串
    • 什么,这个函数是@user2729205?您准备好接收 nvarchar2 了吗?
    • 只是为了获取交易的状态。如果 status 等于 1,那么它已经被批准了。
    • 我真的很抱歉.. 我上周之前使用过 oracle
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2017-06-23
    相关资源
    最近更新 更多