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
我新增一个存储过程,调用上面的函数,把函数的返回值 作为存储过程的输出函数 ,供程序调用
,怎么写 ??
[解决办法]
报的什么错误?
[解决办法]
打开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;
