如果要通过oracle函数实现返回表,应该如何实现呢?
PIPELINED管道函数
从oracle 9i 开始,提供了一个叫做“管道化表函数”的概念,来解决这个问题。
这种类型的函数,必须返回一个集合类型,且标明 pipelined;
这个oracle函数不能返回具体变量,必须以一个空 return 返回;
这个oracle函数中,通过 pipe row () 语句来送出要返回的表中的每一行;
调用这个oracle函数的时候,通过 table() 关键字把管道流仿真为一个数据集。
以下是一个十分简单的实例:
----建表并插入数据
create table tb1(k number, v varchar2(10));
insert into tb1(k, v) values(100,'aaa');
insert into tb1(k, v) values(200,'bbb');
insert into tb1(k, v) values(200,'ccc');
----创建type
create type row_type1 as object(k number, v varchar2(10));
create type table_type1 as table of row_type1;
--创建管道函数
create or replace function fun1
return table_type1 pipelined
as
v row_type1;
begin
for myrow in (select k, v from tb1) loop
v := row_type1(myrow.k, myrow.v);
pipe row (v);
end loop;
return;
end;
--调用管道函数
select * from table(fun1);
如果oracle函数带参数,可以写法如下:
create or replace function fun1(i_v Int) return table_type1 pipelined as v1 row_type1; begin for myrow in (select k, v from tb1 Where k = i_v) loop v1 := row_type1(myrow.k, myrow.v); pipe row (v1); end loop; return; end; select * from table(fun1(100));
PL/SQL表 + table()用法
利用table()函数,我们可以将PL/SQL返回的结果集代替table。
演示如下:
----创建type
create or replace type t_test as object(
id integer,
rq date,
mc varchar2(60)
);
create or replace type t_test_table as table of t_test;
--创建函数
create or replace function f_test_array(n in number default null) return t_test_table
as
v_test t_test_table := t_test_table();
begin
for i in 1 .. nvl(n,100) loop
v_test.extend();
v_test(v_test.count) := t_test(i,sysdate,'mc'||i);
end loop;
return v_test;
end f_test_array;
/
select * from table(f_test_array(10));
字符串切分为多行
使用管道函数实现
1.创建type对象
create or replace type type_split as table of varchar2(4000);
2.创建split函数
create or replace function test_split(p_list VARCHAR2, p_sep VARCHAR2)
return type_split PIPELINED
IS
l_idx PLS_INTEGER;
v_list VARCHAR2(32767) := p_list;
begin
LOOP
l_idx := instr(v_list, p_sep);
IF l_idx > 0 THEN
PIPE ROW(substr(v_list, 1, l_idx - 1));
v_list := substr(v_list, l_idx + length(p_sep));
ELSE
PIPE ROW(v_list);
EXIT;
END IF;
END LOOP;
RETURN;
end test_split;
3.执行该函数(table涵数用法)
SELECT * FROM table(test_split('aaa,bbb,ccc',','));
4.输出结果
COLUMN_VALUE --------------------------- 1 aaa 2 bbb 3 ccc
5.总结
此函数可以在存储过程(procedure)中使用,当遇到需要用逗号进行分隔的字符串,可以用这种方法查询,之后用游标(cursor)来分别提取每个字符串。
来源:https://www.cnblogs.com/marxist/p/12255775.html