oracle存储过程调用函数 ?解决方法

oracle存储过程调用函数 ?函数:function CreateDiagClaimForOnePerson(P_YEARnumber, --生成年度P_CERTIFI

oracle存储过程调用函数 ?
函数:


function CreateDiagClaimForOnePerson
  (
    P_YEAR           number, --生成年度
    P_CERTIFICATENUM varchar2, --身份证号(18位)
    P_CREATORID      varchar2, --操作员ID
    P_CREATORNAME    varchar2, --操作员姓名
    P_UNIQUEID       varchar2, --理赔单唯一编号
    P_OTHERPAY       number, --扣除的其他报销金额(仅在超封顶线时用)
    P_CREATETYPE     number, --1自动批量生成,2手动单个生成
    P_ErrMsg         out varchar2 --返回错误信息描述
  ) return number as

我新增一个存储过程,调用上面的函数,把函数的返回值 作为存储过程的输出函数 ,供程序调用
,怎么写 ??
[解决办法]
引用:
SQL code?1234567891011121314151617181920212223242526--手动生成个人门诊理赔单create or replace procedure UT_CreateClaimForPerson (  P_YEAR           number, --生成年度    P_CERTIFICATENUM varchar2, --身份证……


报的什么错误?
[解决办法]
打开PL/SQL选择存储过程,点“编辑”应该会提示相关的错误信息的
[解决办法]
一、函数和过程是否在同一个包下:
   1.在,直接调用;
   2.不在,但在包里:包名.函数名;
二、函数是公共的,直接调用;

  
[解决办法]
另外,想看错误信息,把执行窗口改为命令行模式,执行后,show errors。
就可以看到了
[解决办法]
少逗号了,括号位置不对,如下为测试代码:
SQL> 
SQL> create or replace procedure UT_CreateClaimForPerson(     P_YEAR           in number, --生成年度
  2                                P_CERTIFICATENUM in varchar2, --身份证号(18位)


  3                                P_CREATORID      in varchar2, --操作员ID
  4                                P_CREATORNAME    in varchar2, --操作员姓名
  5                                P_UNIQUEID       in varchar2, --理赔单唯一编号
  6                                P_OTHERPAY       in number, --扣除的其他报销金额(仅在超封顶线时用)     P_CREATETYPE     in number, --1自动批量生成,2手动单个生成
  7                                p_Result         out number -- 返回结果
  8                                ,P_ErrMsg         out varchar2 --返回错误信息描述
  9                                )
 10  is
 11  begin
 12   return;
 13  end;
 14  /
 
Procedure created
 
SQL> 
[解决办法]
需要记录一个最简单的PL/SQL块,然后在上面进行扩充,这样可以防止你漏掉逗号.
[解决办法]
其实我感觉编辑存储过程,就不能一次性的全部开发完毕。一定要结合报出的错误的类型来进行编辑,我认为依据错误代码来编写存储过程,这才是最重要的。
[解决办法]
第一,LZ, 我觉得你对过程和函数有点误解,OUT类型参数是作为被赋值再输出的,不能作为输入参数,也就不能用在函数中,我觉得楼主之需要把P_ErrMsg out varchar2(2000)改为P_ErrMsg in out varchar2(2000)即可,注意的是P_ErrMsg一定要被赋值,然后才能用于函数。

第二,要想P_ErrMsg在函数中作为OUT输出对象,那么就不应该赋值,这与第一点相矛盾,所以只能说LZ的逻辑是想矛盾的,LZ需要修改,运用些变量来实现,其实很简单的。
------解决方案--------------------


LZ应该是想要下面的结果:(如果P_ErrMsg报错,那就是给P_ErrMsg字段赋值时,已过了捕获函数v_ErrMsg输出的时间,得再想办法)

create or replace procedure UT_CreateClaimForPerson
(P_YEAR           in number, --生成年度     
 P_CERTIFICATENUM in varchar2, --身份证号(18位)       
 P_CREATORID      in varchar2, --操作员ID     
 P_CREATORNAME    in varchar2, --操作员姓名     
 P_UNIQUEID       in varchar2, --理赔单唯一编号     
 P_OTHERPAY       in number, --扣除的其他报销金额(仅在超封顶线时用) 
 P_CREATETYPE     in number, --1自动批量生成,2手动单个生成           
 p_Result         out number, -- 返回结果       
 P_ErrMsg         out varchar2 -- 返回结果)   is     
 v_ErrMsg         varchar2(2000);
begin   
   
   P_Result:= pkg_biz_jk.creatediagclaimforoneperson(P_YEAR,  
                                                     P_CERTIFICATENUM,  
                                                     P_CREATORID, 
                                                     P_CREATORNAME, 
                                                     P_UNIQUEID, 
                                                     P_OTHERPAY, 


                                                     P_CREATETYPE,  
                                                     v_ErrMsg);  
   P_ErrMsg:=v_ErrMsg;
end UT_CreateClaimForPerson;