用PipelinedTable实现split函数的示例
在实际应用中,为了让PL/SQL函数返回多行数据,必须通过返回REF CURSOR或数据集来完成。REF CURSOR的这种情况仅限于可从查询中选择的数据,必须将整个集合物化后才能返回。Oracle 9i通过引入流水线表函数纠正了后一种情况。表是一个返回一组完整行(通常作为一个集合)的函数,可以直接从SQL语句中查询,就像它是一个真正的数据库表一样。流水线表函数与此类似,但它像构建时一样返回数据,而不是一次全部返回。流水线表函数效率更高,因为数据可以尽快返回。
流水线表函数必须返回一个集合。在函数中,PIPE ROW语句用于返回集合中的单个元素,函数必须以空的RETURN语句结束,以表明它已经完成。一旦我们创建了上面的函数,我们就可以使用表操作符从SQL查询中调用它。
管道表函数通常用于将数据从一种类型转换为另一种类型。
下面是用流水线表实现拆分功能的一个例子:
创建或替换类型ty_str_split是VARCHAR2的表(4000);
创建或替换函数fn _ split(VARCHAR2中的p_str,varchar 2中的p _ delimiter)
RETURN ty _ str _ split PIPELINED
IS
j INT:= 0;
I INT:= 1;
len INT:= 0;
len 1 INT:= 0;
str varchar 2(4000);
BEGIN
len:= LENGTH(p _ str);
len 1:= LENGTH(p _ delimiter);
WHILE j < len
LOOP
j:= INSTR(p _ str,p_delimiter,I);
如果j = 0
那么
j:= len;
str := SUBSTR (p_str,I);
管道排(str);
如果i >= len
,则
退出;
END IF;
ELSE
str:= SUBSTR(p _ str,I,j-I);
I:= j+len 1;
管道排(str);
END IF;
结束循环;
返回;
END fn _ split;
/
测试:
SELECT * FROM TABLE(fn _ split(' 1;;12;;123;;1234;;12345', ';;'));
结果:
1
12
123
1234
12345
另一个简单的例子:
创建类型mytype作为对象(
field1 NUMBER,
field 2 varchar 2(50)
);
将类型mytypelist创建为mytype的表;
创建或替换函数pipeline me
RETURN my type list PIPELINED
IS
v _ my type my type;
开始
v _ count IN 1..20
LOOP
v _ my type:= my type(v _ count,' Row ' | | v _ count);
管道行(v _ mytype);
结束循环;
返回;
END pipeline me;
SELECT * FROM TABLE(pipeline me);
field 1 field 2
-
1行1
2行2
3行3
4行4
5行5
6行6
7行7
8行8
9行9
10行10
11行11
12行12
13行13
选择了20行
0条评论