PL/Sql 函数
Posted
技术标签:
【中文标题】PL/Sql 函数【英文标题】:PL/Sql function 【发布时间】:2015-09-17 11:53:20 【问题描述】:我的任务是创建一个具有两个参数的 PL/SQL 函数,在输入它们时,该函数必须返回匹配参数的同一行中的值的总和。如果这些参数与来自数据库函数必须返回零而不是空值。
这是我的代码:
create or replace
function FGET_EST_INV_SUB (unos_fsub in number, unos_bcycle in number)
return number
is
amountb number;
cursor C1 is
select SUM (NVL(AMOUNT,0))
from FMDCUSTINVOICEITEMEST
where FSUBSCRIBER_ID= UNOS_FSUB and BCYCLE = UNOS_BCYCLE;
BEGIN
open C1;
FETCH C1 into AMOUNTB;
if C1%NOTFOUND then
AMOUNTB :=0;
end if;
close C1;
return Amountb;
EXCEPTION
when OTHERS then
raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
end FGET_EST_INV_SUB;
那么,在任何一个参数不匹配的情况下,如何让它在函数本身中返回零,并且在我使用NVL调用函数时请不要说这样做。我需要它在函数内部。
【问题讨论】:
在 FSUBSCRIBER_ID != UNOS_FSUB OR BCYCLE != UNOS_BCYCLE; 的情况下需要返回零而且我不知道如何将其合并到光标中。 您将AMOUNTC
设置为0,然后返回AMOUNTB
。为什么?
那么if
可以吗?
是的,If 语句可以解决问题,但它必须去哪里?
可以在声明中默认返回变量为零:amountb number := 0;
【参考方案1】:
使用游标有点夸张。如果您只想在接受参数时返回总和,或者如果参数无效则返回零,您只需将 select 语句放入其中并使用“into”保存总和。
create or replace
function FGET_EST_INV_SUB (unos_fsub in number, unos_bcycle in number)
return number
is
amountb number;
BEGIN
select SUM(AMOUNT)
into amountb
from FMDCUSTINVOICEITEMEST
where FSUBSCRIBER_ID= UNOS_FSUB and BCYCLE = UNOS_BCYCLE;
return nvl(amountb,0);
EXCEPTION
when OTHERS then
raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
end FGET_EST_INV_SUB;
【讨论】:
SUM() 如果没有返回用于求和的行,则返回 null。如果您也返回 Count(*),那么您可以检测是否没有检测到行。顺便说一句,不喜欢 WHEN OTHERS。 如果参数无效,上面答案中的代码不会返回0,而是返回NULL值。我只是测试了很多次。 对不起,我的错。如果它返回 null 那么你可以使用 amountb 上的 nvl。谢谢纠正.peace.=)以上是关于PL/Sql 函数的主要内容,如果未能解决你的问题,请参考以下文章