我写了一个包,里面有一个过程,编译也通过了,但是在调用时报PLS-00306:wrong number or types of arguments in call to 'PUT_LINE',我在百度上找了很久都不知道怎么改,不知道如何入手,请大家帮忙指点下吧 
这是我的调用写的程序块 
set serveroutput on   
declare    
  o_query1 VF_P_QUREY_OID.refcurosr;    
begin    
VF_P_QUREY_OID.VF_QUREY_OID('1000000','2008-01-01','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;

解决方案 »

  1.   

    下面的那个存储过程是楼主自己写的吗?
    如果是的话不会不知道put_line不能够打印诸如refcursor这类复杂类型吧?
    既然函数返回的是refcursor,楼主可以把函数的返回结果fetch到变量里面,
    然后在一点一点地把它表示出来。
    直接put_line(o_query1)可定时不行滴。
    比如说
    调用
    p1('1',paracur1);
    loop 
    fetch paracur1 into a,b;
    exit when paracur1%nofound;
    dbms_output.put_line('A = '||A||' B = '||B);
    end loop;
      

  2.   

    dbms_output.put_line(o_query1 );这里不对
    dbms_output.put_line(o_query1.字段1||o_query1.字段2||.... );  
    注意类型转换就可以了