在下面的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] 删除。
我来说两句