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 函数的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL编程_概述

PL/SQL自定义函数

PL/Sql 函数

PL/SQL 函数参数

过程或函数 (Pl/sql)

从文件执行 PL/SQL 函数