If条件PLSQL返回的值错误

欧拉·阿瑟(Olla Ashour)

在下面的PLSQL函数中,如果不存在“通知方”,我想返回“客户”值。

结果总是返回条件“即使在存在“通知方”的情况下,也是客户”的值,为什么呢?我使用了相同的功能,但是用来运行,involved_party_qual_gid in ('CONSIGNEE', 'CUSTOMER')并且可以很好地产生所需的结果。

function getNotifyPartyOrCustomer(orderID varchar2) return varchar2

is
NameResult varchar2(100);

CURSOR c_involved_party is
  select involved_party_contact_gid, involved_party_qual_gid
    from order_release_inv_party
   where involved_party_qual_gid in ('NOTIFY PARTY', 'CUSTOMER')
     and order_release_gid = orderID;
begin

for i in c_involved_party loop

  if i.involved_party_qual_gid = 'NOTIFY PARTY' then
    NameResult := i.involved_party_contact_gid;
    return(NameResult);

  elsif i.involved_party_qual_gid = 'CUSTOMER' then
    NameResult := i.involved_party_contact_gid;
    return(NameResult);
  end if;
 end loop;

end;

我编写了两个替代函数,它们产生相同的结果:

1-功能1

function getNotifyPartyOrCustomer(orderID varchar2) return varchar2

 is
  NameResult varchar2(100);

 begin

   select coalesce((select involved_party_contact_gid
                  from order_release_inv_party
                 where involved_party_qual_gid = 'NOTIFY PARTY'
                   and order_release_gid = orderID),

                (select involved_party_contact_gid
                   from order_release_inv_party
                  where involved_party_qual_gid = 'CUSTOMER'
                    and order_release_gid = orderID), 

                'NO DATA'

                ) AS NAME
   INTO NameResult

   from DUAL;

  return NameResult;
end;

2-功能2

function getNotifyPartyOrCustomer(orderID varchar2) return varchar2

 is
   NameResult varchar2(100);


 begin

    select involved_party_contact_gid
    INTO NameResult
    from order_release_inv_party
   where involved_party_qual_gid in ('NOTIFY PARTY')
     and order_release_gid = orderID;

   return(NameResult);

     exception WHEN NO_DATA_FOUND THEN

      select involved_party_contact_gid
        into NameResult
        from order_release_inv_party
       where involved_party_qual_gid in ('CUSTOMER')
         and order_release_gid = orderID;   



 return(NameResult);
end;

但是我对这两个函数不满意,因为从性能角度来看,首先,我看不到必须从同一张表中进行两次检索的意义,因为我只能在一次检索中获得结果并对其进行逻辑处理第二,因为我需要其他逻辑的if条件。

我只需要知道为什么它不起作用。

感谢所有帮助。谢谢你。

艾伦

第一个函数的结果将取决于查询返回行的顺序。由于不提供order by子句,数据库可以按任何顺序返回行。如果要优先于“ NOTIFY PARTY”而不是“ CUSTOMER”,则可以在查询中添加以下内容:

order by involved_party_qual_gid desc

您可以正常工作的其他功能可能恰巧在这样做。如果某种原因导致数据库以不同的顺序返回行(例如从备份还原,重新组织索引,或者甚至表中足够的数据来更改计划),它可能会更改。


跟进

通常,当您处理SQL时,如果要遍历结果集,则采用的方法很差。数据库引擎确实擅长处理基于集合的问题,因此通常最好让引擎处理尽可能多的工作。

在这种情况下,您似乎并不太在乎每行的结果:确实,您只想要第一行包含“ NOTIFY PARTY”,并且,如果不存在这样的记录,则希望第一行包含“ CUSTOMER” ”。假设您的结果集返回500行。当您只关心1行的值时,为什么还要遍历全部500个?如果我正在编写此函数,则将完全失去迭代:

function getNotifyPartyOrCustomer(orderID varchar2) return varchar2 is
NameResult varchar2(100);

CURSOR c_involved_party is
  select involved_party_contact_gid
    from order_release_inv_party
   where involved_party_qual_gid in ('NOTIFY PARTY', 'CUSTOMER')
     and order_release_gid = orderID
   order by involved_party_qual_gid desc;

v_contact_gid order_release_inv_party.involved_party_contact_gid%type;
begin

open c_involved_party;
fetch c_involved_party into v_contact_gid;
close c_involved_party;

return v_contact_gid;

end getNotifyPartyOrCustomer;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章