我写了一个包,里面有一个过程,编译也通过了,但是在调用时报PLS-00306:wrong number or types of arguments in call to 'PUT_LINE',我在百度上找了很久都不知道怎么改,不知道如何入手,请大家帮忙指点下吧
这是我的调用写的程序块
set serveroutput on
declare
o_query VF_P_QUREY_OID.refcurosr;
begin
VF_P_QUREY_OID.VF_QUREY_OID('1000000','2008-01-1','2008-01-31',o_query1);
--显示过程VF_QUREY_OID的查询结果。
dbms_output.put_line(o_query1 );
end;
大帮忙看下我的调用方法哪里出错了,我把我的包的包头和包体源码发上来:
--根据机构查询,建立VF_P_QUREY_OID包实现数据集返回
--根据机构查询,建立VF_QUREY_OID过程查询数据create or replace package VF_P_QUREY_OID IS--包头
type refcurosr is ref cursor;
--下面是有四个参数的过程
procedure VF_QUREY_OID(o_id in varchar2,--机构号
begin_time in varchar2,--起始日期
end_time in varchar2,--终止日期
o_query out refcurosr);--返回的数据集end VF_P_QUREY_OID;
/
CREATE OR REPLACE PACKAGE BODY VF_P_QUREY_OID IS--包体
--下面是有四个参数的过程 PROCEDURE VF_QUREY_OID(o_id in VARCHAR2,--机构号
begin_time in VARCHAR2,--起始日期
end_time in VARCHAR2,--终止日期
o_query out refcurosr) IS--返回的数据集
cursor C_TEMP is select class_id from lu_organ where organ_id=o_id;--把Class_id放入C_temp游标
X C_TEMP%rowtype;--用来判断的变量
BEGIN
OPEN C_TEMP;
FETCH C_TEMP into X;
IF X.CLASS_ID=1 --当class_id=1时
THEN
OPEN o_query FOR select b.branch_name, --查询开始,我的业务逻辑,单独的Select没有错
sum(decode(POLICY_YEAR,1,ACCEPT_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,ACCEPT_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,MANAGE_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,MANAGE_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,FETCH_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,FETCH_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,CHANGED_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,CHANGED_AMOUNT,0)),
(sum(decode(POLICY_YEAR,1,ENC_COMM_AMOUNT,0))+sum(decode(sign(POLICY_YEAR-1),1,DR_COMM_AMOUNT,0)))
from VF_ACCEPT_AMOUNT a,lu_organ b
where a.organ_id=b.organ_id
and trunc(a.finish_time) >=trunc(to_date(begin_time,'yyyy-mm-dd'))--起始日期
and trunc(a.finish_time) <=trunc(to_date(end_time,'yyyy-mm-dd')) --终止日期
and a.PERIOD_TYPE=3
and b.spot_code in( select spot_code from lu_organ
where stem_code in(select stem_code from lu_organ
where branch_code in (select branch_code from lu_organ where head_id in(SELECT HEAD_ID from lu_organ
where organ_id=o_id)) and branch_code is not null) and stem_code is not null)
group by b.branch_name;
ELSIF X.CLASS_ID=2 --当class_id=2时
THEN
OPEN o_query FOR select b.stem_name,--用O_id来查询所要的数据放到refcurosr中,
sum(decode(POLICY_YEAR,1,ACCEPT_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,ACCEPT_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,MANAGE_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,MANAGE_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,FETCH_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,FETCH_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,CHANGED_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,CHANGED_AMOUNT,0)),
(sum(decode(POLICY_YEAR,1,ENC_COMM_AMOUNT,0))+sum(decode(sign(POLICY_YEAR-1),1,DR_COMM_AMOUNT,0)))
from VF_ACCEPT_AMOUNT a,lu_organ b
where a.organ_id=b.organ_id
and trunc(a.finish_time) >=trunc(to_date(begin_time,'yyyy-mm-dd'))
and trunc(a.finish_time) <=trunc(to_date(end_time,'yyyy-mm-dd'))
and a.PERIOD_TYPE=3
and b.spot_CODE in( select spot_CODE from lu_organ
where stem_CODE in (select stem_CODE from lu_organ
where branch_code=(select branch_code from lu_organ
where organ_id=o_id) and branch_code is not null))
group by b.stem_name,b.spot_code;ELSIF X.CLASS_ID=3 --当class_id=3时
THEN
OPEN o_query FOR select b.spot_name,
sum(decode(POLICY_YEAR,1,ACCEPT_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,ACCEPT_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,MANAGE_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,MANAGE_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,FETCH_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,FETCH_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,CHANGED_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,CHANGED_AMOUNT,0)),
(sum(decode(POLICY_YEAR,1,ENC_COMM_AMOUNT,0))+sum(decode(sign(POLICY_YEAR-1),1,DR_COMM_AMOUNT,0)))
from VF_ACCEPT_AMOUNT a,lu_organ b
where a.organ_id=b.organ_id
and a.PERIOD_TYPE=3
and trunc(a.finish_time) >=trunc(to_date(begin_time,'yyyy-mm-dd'))
and trunc(a.finish_time) <=trunc(to_date(end_time,'yyyy-mm-dd'))
and b.spot_CODE in( select spot_code from lu_organ
where stem_code in ( select stem_code from lu_organ
where organ_id=o_id ) and spot_code is not null)
group by b.spot_name;
END IF;
close C_TEMP;
END VF_QUREY_OID;
END VF_P_QUREY_OID;
这是我的调用写的程序块
set serveroutput on
declare
o_query VF_P_QUREY_OID.refcurosr;
begin
VF_P_QUREY_OID.VF_QUREY_OID('1000000','2008-01-1','2008-01-31',o_query1);
--显示过程VF_QUREY_OID的查询结果。
dbms_output.put_line(o_query1 );
end;
大帮忙看下我的调用方法哪里出错了,我把我的包的包头和包体源码发上来:
--根据机构查询,建立VF_P_QUREY_OID包实现数据集返回
--根据机构查询,建立VF_QUREY_OID过程查询数据create or replace package VF_P_QUREY_OID IS--包头
type refcurosr is ref cursor;
--下面是有四个参数的过程
procedure VF_QUREY_OID(o_id in varchar2,--机构号
begin_time in varchar2,--起始日期
end_time in varchar2,--终止日期
o_query out refcurosr);--返回的数据集end VF_P_QUREY_OID;
/
CREATE OR REPLACE PACKAGE BODY VF_P_QUREY_OID IS--包体
--下面是有四个参数的过程 PROCEDURE VF_QUREY_OID(o_id in VARCHAR2,--机构号
begin_time in VARCHAR2,--起始日期
end_time in VARCHAR2,--终止日期
o_query out refcurosr) IS--返回的数据集
cursor C_TEMP is select class_id from lu_organ where organ_id=o_id;--把Class_id放入C_temp游标
X C_TEMP%rowtype;--用来判断的变量
BEGIN
OPEN C_TEMP;
FETCH C_TEMP into X;
IF X.CLASS_ID=1 --当class_id=1时
THEN
OPEN o_query FOR select b.branch_name, --查询开始,我的业务逻辑,单独的Select没有错
sum(decode(POLICY_YEAR,1,ACCEPT_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,ACCEPT_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,MANAGE_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,MANAGE_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,FETCH_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,FETCH_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,CHANGED_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,CHANGED_AMOUNT,0)),
(sum(decode(POLICY_YEAR,1,ENC_COMM_AMOUNT,0))+sum(decode(sign(POLICY_YEAR-1),1,DR_COMM_AMOUNT,0)))
from VF_ACCEPT_AMOUNT a,lu_organ b
where a.organ_id=b.organ_id
and trunc(a.finish_time) >=trunc(to_date(begin_time,'yyyy-mm-dd'))--起始日期
and trunc(a.finish_time) <=trunc(to_date(end_time,'yyyy-mm-dd')) --终止日期
and a.PERIOD_TYPE=3
and b.spot_code in( select spot_code from lu_organ
where stem_code in(select stem_code from lu_organ
where branch_code in (select branch_code from lu_organ where head_id in(SELECT HEAD_ID from lu_organ
where organ_id=o_id)) and branch_code is not null) and stem_code is not null)
group by b.branch_name;
ELSIF X.CLASS_ID=2 --当class_id=2时
THEN
OPEN o_query FOR select b.stem_name,--用O_id来查询所要的数据放到refcurosr中,
sum(decode(POLICY_YEAR,1,ACCEPT_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,ACCEPT_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,MANAGE_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,MANAGE_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,FETCH_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,FETCH_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,CHANGED_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,CHANGED_AMOUNT,0)),
(sum(decode(POLICY_YEAR,1,ENC_COMM_AMOUNT,0))+sum(decode(sign(POLICY_YEAR-1),1,DR_COMM_AMOUNT,0)))
from VF_ACCEPT_AMOUNT a,lu_organ b
where a.organ_id=b.organ_id
and trunc(a.finish_time) >=trunc(to_date(begin_time,'yyyy-mm-dd'))
and trunc(a.finish_time) <=trunc(to_date(end_time,'yyyy-mm-dd'))
and a.PERIOD_TYPE=3
and b.spot_CODE in( select spot_CODE from lu_organ
where stem_CODE in (select stem_CODE from lu_organ
where branch_code=(select branch_code from lu_organ
where organ_id=o_id) and branch_code is not null))
group by b.stem_name,b.spot_code;ELSIF X.CLASS_ID=3 --当class_id=3时
THEN
OPEN o_query FOR select b.spot_name,
sum(decode(POLICY_YEAR,1,ACCEPT_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,ACCEPT_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,MANAGE_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,MANAGE_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,FETCH_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,FETCH_AMOUNT,0)),
sum(decode(POLICY_YEAR,1,CHANGED_AMOUNT,0)),sum(decode(sign(POLICY_YEAR-1),1,CHANGED_AMOUNT,0)),
(sum(decode(POLICY_YEAR,1,ENC_COMM_AMOUNT,0))+sum(decode(sign(POLICY_YEAR-1),1,DR_COMM_AMOUNT,0)))
from VF_ACCEPT_AMOUNT a,lu_organ b
where a.organ_id=b.organ_id
and a.PERIOD_TYPE=3
and trunc(a.finish_time) >=trunc(to_date(begin_time,'yyyy-mm-dd'))
and trunc(a.finish_time) <=trunc(to_date(end_time,'yyyy-mm-dd'))
and b.spot_CODE in( select spot_code from lu_organ
where stem_code in ( select stem_code from lu_organ
where organ_id=o_id ) and spot_code is not null)
group by b.spot_name;
END IF;
close C_TEMP;
END VF_QUREY_OID;
END VF_P_QUREY_OID;
错误是说,你在调put_line的时候给的参数类型有问题,
貌似o_query1你这个变量名称写错了,你上面好象只有o_query
set serveroutput on
declare
o_query1 VF_P_QUREY_OID.refcurosr;
begin
VF_P_QUREY_OID.VF_QUREY_OID('1000000','2008-01-1','2008-01-31',o_query1);
--显示过程VF_QUREY_OID的查询结果。
dbms_output.put_line(o_query1 );
end;
这是我的执行语句