【问题标题】:PL/Sql functionPL/Sql 函数
【发布时间】: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;

标签: oracle plsql plsqldeveloper


【解决方案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.=)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多