0

我已经建立了这个功能来打印所有项目的列表以及每个项目的承诺总额。我需要格式化输出以显示$值的符号、逗号和两位小数。

到目前为止,我可以获得结果,但没有格式化。我包含to_char在函数中。

当我调用它时,我收到此错误:

ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "SYSTEM.DD_PROJECT_SF", line 19
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    

*行动:

这是我的功能:

create or replace function DD_PROJECT_SF (

project_id dd_project.idproj%type)

return number is 

pledge_amount dd_pledge.pledgeamt%type;
project_name  dd_project.projname%type;
projid     dd_pledge.idproj%type;

begin 

select idproj, projname into   projid, project_name from  dd_project

where idproj = project_id;

select to_char(sum(pledgeamt), '$9,990.99')  into pledge_amount from dd_pledge 
where idproj = project_id;

if (pledge_amount = 0) then
return 0;
else
return pledge_amount;
end if;

return pledge_amount;

end  DD_PROJECT_SF;

这是调用 SQL 语句:

select idproj, projname, DD_PROJECT_SF(idproj) from dd_project;

我怎样才能解决这个问题?

4

1 回答 1

3

首先,您要返回一个数字并将一个 varchar 选择到一个数字变量中。您需要所有数据类型相同。当您想要返回一个字符时,可能更容易将一个数字选择为一个数字,然后在您返回它时将变量转换为一个字符。

其次,这里有很多不必要的代码。可以简化为:

create or replace function DD_PROJECT_SF (
    Pproject_id dd_project.idproj%type 
    ) return varchar2 is 

   -- As you're summing you don-t know
   -- whether the sum will fit in the same
   -- data type so extend to the maximum
   pledge_amount number;

begin 

   -- select a number
   select sum(pledgeamt) into pledge_amount 
     from dd_pledge 
    where idproj = Pproject_id;

   -- return a character
   return to_char(pledge_amount, '$9,990.99');

end  DD_PROJECT_SF;

作为旁注,当您总结时,您怎么知道最高金额将低于 10,000 美元?您可能希望扩展它以考虑更大的数字。

最后,这是可以在 SQL 语句而不是 PL/SQL 中轻松完成的事情。如果可能,请考虑使用一个。


你评论过:

...我在这里使用了 if 语句,因为我希望函数在总数为 0 时向我显示零而不是 null。所以我如何将它包含在您的代码中。我尝试过但没有成功

如果质押的 SUM 为 0,则此函数将始终返回 0。如果表中没有与此相关的数据,则IDPROJ返回 NULL 。

就个人而言,如果是这种情况,我不会通过返回 0 来掩饰您没有数据的事实。NULL 和 0 在逻辑上是不同的;如果你这样做,你就会失去这种区别。

话虽如此,如果您总是想在没有数据的情况下返回 0,那么您可以使用它NVL()来执行此操作。将您的退货声明更改为以下内容:

return to_char(nvl(pledge_amount, 0), '$9,990.99');
于 2013-05-31T10:16:26.883 回答