oracle带type返回值的package的调用

落落葉子 2015-01-07 02:04:42
如下package:
CREATE OR REPLACE package SCOTT.pk_wt
is
type mytype is ref cursor;
procedure p_wt(mycs out mytype);
end;

CREATE OR REPLACE package BODY SCOTT.pk_wt
is
procedure p_wt(mycs out mytype)
is
r_cur mytype;
begin
open r_cur for select * from emp;
end p_wt;
end pk_wt;
这个package是我的package的简化版,有这样一个package,我想在查询分析器中或者sqlplus能直接调用这个package,其实就是想利用package来查询一张表的结果,求各位大神指点下
...全文
298 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
落落葉子 2015-01-07
  • 打赏
  • 举报
回复
多谢版主大神的指点,现在已经成功了
落落葉子 2015-01-07
  • 打赏
  • 举报
回复
引用 4 楼 wildwave 的回复:
写个例子给你,利用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> 
太感谢了,我去试试=。=
落落葉子 2015-01-07
  • 打赏
  • 举报
回复
引用 3 楼 wildwave 的回复:
不太清楚你这里报表平台是什么样的 像java这样的直接接收返回的游标就可以 类似plsql的查询分析器语句是什么意思,只能用类似select .. from 这样的语法?
恩,或者简单的语法应该也可以,只要最后的输出情况跟用select from查表一样,返回是一个结果集一样形式应该都行
小灰狼W 2015-01-07
  • 打赏
  • 举报
回复
写个例子给你,利用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> 
小灰狼W 2015-01-07
  • 打赏
  • 举报
回复
不太清楚你这里报表平台是什么样的 像java这样的直接接收返回的游标就可以 类似plsql的查询分析器语句是什么意思,只能用类似select .. from 这样的语法?
落落葉子 2015-01-07
  • 打赏
  • 举报
回复
引用 1 楼 wildwave 的回复:
该package的存储过程是可以直接调用的,但调用的时候,你要用一个pk_wt.mytype类型的变量来存储传出参数 必须用存储过程对这个游标进行处理,才能展示查询结果 本来可以直接查询一张表,你把结果集放到游标里,自然要解析游标才能看到结果
版主大神=。=,是这样的,我现在是需要写一个要循环返销历史金额的报表,中间逻辑我这边是忽略掉了,而展现报表的平台能支持的语句类似于plsql的查询分析器窗口,现在开发卡在了调用的输出上,大神你说的用一个pk_wt.mytype类型的变量来存储传出参数这该怎么实现?
小灰狼W 2015-01-07
  • 打赏
  • 举报
回复
该package的存储过程是可以直接调用的,但调用的时候,你要用一个pk_wt.mytype类型的变量来存储传出参数 必须用存储过程对这个游标进行处理,才能展示查询结果 本来可以直接查询一张表,你把结果集放到游标里,自然要解析游标才能看到结果

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧