用PipelinedTable实现split函数的示例

用PipelinedTable实现split函数的示例,第1张

用PipelinedTable实现split函数的示例,第2张

在实际应用中,为了让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行

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 用PipelinedTable实现split函数的示例

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情