解决方案 »

  1.   

    该package的存储过程是可以直接调用的,但调用的时候,你要用一个pk_wt.mytype类型的变量来存储传出参数
    必须用存储过程对这个游标进行处理,才能展示查询结果本来可以直接查询一张表,你把结果集放到游标里,自然要解析游标才能看到结果
      

  2.   

    版主大神=。=,是这样的,我现在是需要写一个要循环返销历史金额的报表,中间逻辑我这边是忽略掉了,而展现报表的平台能支持的语句类似于plsql的查询分析器窗口,现在开发卡在了调用的输出上,大神你说的用一个pk_wt.mytype类型的变量来存储传出参数这该怎么实现?
      

  3.   

    不太清楚你这里报表平台是什么样的
    像java这样的直接接收返回的游标就可以
    类似plsql的查询分析器语句是什么意思,只能用类似select .. from 这样的语法?
      

  4.   

    写个例子给你,利用table()函数,使用select * from来输出游标中的结果集
    不过如果结果集较大,不建议这么用SQL> CREATE OR REPLACE package pk_wt
      2  is
      3  type mytype is ref cursor;
      4  procedure p_wt(mycs out mytype);
      5  end;
      6  /
     
    Package created
     
    SQL> 
    SQL> CREATE OR REPLACE package BODY pk_wt
      2  is
      3  procedure p_wt(mycs out mytype)
      4  is
      5  begin
      6  open mycs for select * from scott.emp;
      7  end p_wt;
      8  end pk_wt;
      9  /
     
    Package body created
     
    SQL> 
    SQL> create type tp_point1 as object(empno NUMBER(4),ENAME VARCHAR2(10),JOB VARCHAR2(9),MGR NUMBER(4),HIREDATE DATE
      2    ,SAL NUMBER(7,2),COMM NUMBER(7,2),DEPTNO NUMBER(2))
      3  /
     
    Type created
     
    SQL> 
    SQL> create type tp_point1newt as table of tp_point1
      2  /
     
    Type created
     
    SQL> 
    SQL> create or replace function func_wt return tp_point1newt pipelined
      2  as
      3  v_mycs pk_wt.mytype;
      4  v_empno NUMBER(4);
      5  v_ENAME VARCHAR2(10);
      6  v_JOB VARCHAR2(9);
      7  v_MGR NUMBER(4);
      8  v_HIREDATE DATE;
      9  v_SAL NUMBER(7,2);
     10  v_COMM NUMBER(7,2);
     11  v_DEPTNO NUMBER(2);
     12  begin
     13    pk_wt.p_wt(v_mycs);
     14    loop
     15      fetch v_mycs into v_empno,v_ENAME,v_JOB,v_MGR,v_HIREDATE,v_SAL,v_COMM,v_DEPTNO;
     16      exit when v_mycs%notfound;
     17      pipe row(tp_point1(v_empno,v_ENAME,v_JOB,v_MGR,v_HIREDATE,v_SAL,v_COMM,v_DEPTNO));
     18    end loop;
     19    return;
     20  end;
     21  /
     
    Function created
     
    SQL> select * from table(func_wt);
     
         EMPNO ENAME      JOB              MGR HIREDATE           SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- ----------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 1980/12/17         800                    20
          7499 ALLEN      SALESMAN        7698 1981/02/20        1600        300         30
          7521 WARD       SALESMAN        7698 1981/02/22        1250        500         30
          7566 JONES      MANAGER         7839 1981/04/02        2975                    20
          7654 MARTIN     SALESMAN        7698 1981/09/28        1250       1400         30
          7698 BLAKE      MANAGER         7839 1981/05/01        2850                    30
          7782 CLARK      MANAGER         7839 1981/06/09        2450                    10
          7788 SCOTT      ANALYST         7566 1987/04/19        3000                    20
          7839 KING       PRESIDENT            1981/11/17        5000                    10
          7844 TURNER     SALESMAN        7698 1981/09/08        1500          0         30
          7876 ADAMS      CLERK           7788 1987/05/23        1100                    20
          7900 JAMES      CLERK           7698 1981/12/03         950                    30
          7902 FORD       ANALYST         7566 1981/12/03        3000                    20
          7934 MILLER     CLERK           7782 1982/01/23        1300                    10
     
    14 rows selected
     
    SQL> 
      

  5.   

    恩,或者简单的语法应该也可以,只要最后的输出情况跟用select from查表一样,返回是一个结果集一样形式应该都行