Oracle 使用to_char from SQL语句调用PL/SQL函数

Oracle 使用to_char from SQL语句调用PL/SQL函数,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,我已经建立了这个功能来打印所有项目的列表,以及每个项目的认捐总额。我需要格式化输出以显示$符号、逗号和值的两位小数 到目前为止,我可以得到结果,但没有格式。我在函数中包含了到\u 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

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

到目前为止,我可以得到结果,但没有格式。我在函数中包含了
到\u 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;

如何解决此问题?

首先,您返回一个数字,并在数字变量中选择一个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;
作为旁注,当你在求和时,你怎么知道最高金额将少于10000美元?您可能希望将此扩展以考虑更大的数字

最后,这是一种可以在SQL语句中而不是PL/SQL中轻松完成的事情。如果可能的话,考虑使用一个。< /P>
您评论过:

。。。我在这里使用if语句,因为我想让函数显示 如果总数为0,则为零而不是null。那么,我如何将其包括在 你的代码。我尝试过,但没有成功

如果保证的总和为0,此函数将始终返回0。只有在表中没有与此
IDPROJ
相关的数据时,才会返回NULL

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

话虽如此,如果您总是希望在没有数据的情况下返回0,那么您可以使用。将您的返回声明更改为以下内容:

return to_char(nvl(pledge_amount, 0), '$9,990.99');

首先,返回一个数字,并选择一个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;
作为旁注,当你在求和时,你怎么知道最高金额将少于10000美元?您可能希望将此扩展以考虑更大的数字

最后,这是一种可以在SQL语句中而不是PL/SQL中轻松完成的事情。如果可能的话,考虑使用一个。< /P>
您评论过:

。。。我在这里使用if语句,因为我想让函数显示 如果总数为0,则为零而不是null。那么,我如何将其包括在 你的代码。我尝试过,但没有成功

如果保证的总和为0,此函数将始终返回0。只有在表中没有与此
IDPROJ
相关的数据时,才会返回NULL

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

话虽如此,如果您总是希望在没有数据的情况下返回0,那么您可以使用。将您的返回声明更改为以下内容:

return to_char(nvl(pledge_amount, 0), '$9,990.99');

dd\u质押的类型是什么。质押的类型是什么?@JoachimIsaksson它的编号(8,2)是什么类型的
dd\u质押的类型是什么。质押的类型是什么?@JoachimIsaksson它的编号(8,2)例如,我在这里使用了if语句,因为我希望函数在总数为0的情况下显示零而不是null。那么我该如何将其包含在您的代码中。我尝试过,但没有成功。我已经更新了我的答案@user2396035,因为它不适合在注释中。例如,我在这里使用了if语句,因为我希望函数显示零,而不是总值为0的null。那么我该如何将其包含在您的代码中呢?我尝试过,但没有成功。我已经更新了我的答案@user2396035,因为它不适合在注释中。