我想创建一个带有一个参数的存储过程,该参数将根据参数返回不同的记录集.这样做的方法是什么?我可以从普通的SQL中调用它吗?
Ton*_*ews 65
以下是如何构建一个函数,该函数返回一个可以像查询表一样查询的结果集:
SQL> create type emp_obj is object (empno number, ename varchar2(10));
2 /
Type created.
SQL> create type emp_tab is table of emp_obj;
2 /
Type created.
SQL> create or replace function all_emps return emp_tab
2 is
3 l_emp_tab emp_tab := emp_tab();
4 n integer := 0;
5 begin
6 for r in (select empno, ename from emp)
7 loop
8 l_emp_tab.extend;
9 n := n + 1;
10 l_emp_tab(n) := emp_obj(r.empno, r.ename);
11 end loop;
12 return l_emp_tab;
13 end;
14 /
Function created.
SQL> select * from table (all_emps);
EMPNO ENAME
---------- ----------
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7902 FORD
7934 MILLER
Run Code Online (Sandbox Code Playgroud)
Thi*_*ilo 22
我想你想要返回一个REFCURSOR:
create function test_cursor
return sys_refcursor
is
c_result sys_refcursor;
begin
open c_result for
select * from dual;
return c_result;
end;
Run Code Online (Sandbox Code Playgroud)
更新:如果你需要从SQL调用它,请使用像@Tony安德鲁斯建议的表函数.
您可以使用Oracle管道功能
基本上,当您希望PLSQL(或java或c)例程成为数据的"源" - 而不是表 - 时,您将使用流水线函数.
简单示例 - 生成一些随机数据
您如何根据输入参数创建N个唯一随机数?
create type array
as table of number;
create function gen_numbers(n in number default null)
return array
PIPELINED
as
begin
for i in 1 .. nvl(n,999999999)
loop
pipe row(i);
end loop;
return;
end;
Run Code Online (Sandbox Code Playgroud)
假设我们需要三行.我们现在可以通过以下两种方式之一做到这一点:
select * from TABLE(gen_numbers(3));
Run Code Online (Sandbox Code Playgroud)
COLUMN_VALUE
1
2
3
Run Code Online (Sandbox Code Playgroud)
要么
select * from TABLE(gen_numbers)
where rownum <= 3;
Run Code Online (Sandbox Code Playgroud)
COLUMN_VALUE
1
2
3
Run Code Online (Sandbox Code Playgroud)
pipelied Functions1 pipelied Functions2