一种选择是使用参考光标(正如 Abra 评论的那样)。我没有你的桌子,所以我用了 Scott 的。
SQL> create or replace function searchbyid (par_deptno in dept.deptno%type)
2 return sys_refcursor
3 is
4 rc sys_refcursor;
5 begin
6 open rc for
7 select d.deptno, d.dname, e.ename, e.job, e.sal
8 from emp e join dept d on d.deptno = e.deptno
9 where d.deptno = par_deptno;
10
11 return rc;
12 end;
13 /
Function created.
SQL> select searchbyid(10) result from dual;
RESULT
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
DEPTNO DNAME ENAME JOB SAL
---------- -------------- ---------- --------- ----------
10 ACCOUNTING CLARK MANAGER 2450
10 ACCOUNTING KING PRESIDENT 5000
10 ACCOUNTING MILLER CLERK 1300
SQL>
另一个选项是流水线函数:
类型优先:
SQL> create or replace type t_row as object
2 (deptno number,
3 dname varchar2(10),
4 ename varchar2(10),
5 job varchar2(10),
6 sal number
7 );
8 /
Type created.
SQL> create or replace type t_tab is table of t_row;
2 /
Type created.
功能:
SQL> create or replace function searchbyid (par_deptno in dept.deptno%type)
2 return t_tab pipelined
3 is
4 begin
5 for cur_r in (select d.deptno, d.dname, e.ename, e.job, e.sal
6 from emp e join dept d on d.deptno = e.deptno
7 where d.deptno = par_deptno
8 )
9 loop
10 pipe row (t_row(cur_r.deptno, cur_r.dname, cur_r.ename, cur_r.job, cur_r.sal));
11 end loop;
12 return;
13 end;
14 /
Function created.
SQL> select * from table(searchbyid(10));
DEPTNO DNAME ENAME JOB SAL
---------- ---------- ---------- ---------- ----------
10 ACCOUNTING CLARK MANAGER 2450
10 ACCOUNTING KING PRESIDENT 5000
10 ACCOUNTING MILLER CLERK 1300
SQL>
[编辑,编辑问题后]
屏幕截图显示了当函数在 SQL Developer 中返回 ref 游标时数据的样子。如果您想很好地看到它,请滚动到最右侧并单击铅笔图标;像这样:
(点击(1)得到结果为(2))