oracle 应用管道函数时 pipelined

ID:1697298

大小:34.50 KB

页数:3页

时间:2017-11-13

oracle 应用管道函数时 pipelined_第1页
oracle 应用管道函数时 pipelined_第2页
oracle 应用管道函数时 pipelined_第3页
资源描述:

《oracle 应用管道函数时 pipelined》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Oracle应用管道函数时pipelined出现PLS-00653:在PL/SQL定义域内不允许有聚集/表函数网友说:在实际的应用中,为了让PL/SQL函数返回数据的多个行,必须通过返回一个REFCURSOR或一个数据集合来完成。REFCURSOR的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。9i通过引入的管道化表函数纠正了后一种情况。表函数是返回整个行的集(通常作为一个集合)的函数,可以直接从SQL语句中进行查询,就好像它是一个真正的数据库表一样。管道化表函数与之相似,但是它像在构建时一样返回数据,而不是一次全部返回。管道化表函数更加有效,

2、因为数据可以尽可能快地返回。自己总结:管道化表函数pipelined必须返回一个集合。在函数中,PIPEROW语句被用来返回该集合的单个元素,该函数必须以一个空的RETURN语句结束,以表明它已经完成。一旦我们创建了上述函数,我们就可以使用TABLE操作符从SQL查询中调用它。也就是实际操作当中我们需要是一个数据源而不仅是一张表所以用到管道化表函数,而且用这个函数在返回大数据时候传输的速度比较快。下面是有关pipelined在生活中的用遇到的一些问题:1.创建一个表类型的BcreateorreplacetypeTastableofvarchar(300)2.比如我们创建一个带

3、pipelied 管道函数返回一张表或一个数据源数据的函数AcreateorreplacefunctionA(parasvarchar2)returnTpipelinedisbegin....return;--注意这边直接返回就可以了endA;和创建一个不带该管道函数同样也返回一张表的类型的函数B。createorreplacefunctionB(parasvarchar2)returnTisvar_outT;begin....returnvar_out;--这边必须有个输出参数作为返回值endB;3.接下来我们创建一个存储过程C去调用A和Bcreateorreplacepr

4、ocedureC(parasvarchar2)isvar_outT;begin--方法(1)T:=A('parasValues');--这边调用带pipelined函数的函数A---直接报错PLS-00653:在PL/SQL定义域内不允许有聚集/表函数这是因为管道函数需要用TABLE操作符从SQL查询中调用它所以这边不能直接赋值这边要赋值可以这样修改selectA('parasValues')intoTfromdual;就可以--方法(2)T:=B('parasValues');--这边调用函数B....endC;难道是在存储过程中调用pipelined函数是不行的吗?答案:

5、是可以的。管道函数调用过程不能直接用":="进行赋值我们可以采用上面使用赋值方式selectA('parasValues')intoTfromdual;下面是提供一个完整管道函数拆分字符串代码我已经测试过没问题。pl/sql执行就OK--创建类型createorreplacetypetype_splitastableofvarchar2(50);--创建管道函数createorreplacefunctionsplit(p_listvarchar2,p_sepvarchar2:=',')returntype_splitpipelined--管道函数关键字isl_idxpls_i

6、nteger;v_listvarchar2(50):=p_list;beginloopl_idx:=instr(v_list,p_sep);ifl_idx>0thenpiperow(substr(v_list,1,l_idx-1));v_list:=substr(v_list,l_idx+length(p_sep));elsepiperow(v_list);exit;endif;endloop;return;endsplit;--测试改管道函数是否正确select column_value  from table(split('Hello,Cnblogs!',','));--

7、在存储过程调用运用该管道函数createorreplaceprocedureprc(paraoutvarchar2)isvar_outvarchar2(200);var_splittype_split;begin--调用方式一输出拆分的字符串forpin(select column_value  from table(split('Hello,Cnblogs!',',')))loopvar_out:=var_out

8、

9、p.column_value;endloop;--调用方式二输出拆分的字符串selec

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
正文描述:

《oracle 应用管道函数时 pipelined》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Oracle应用管道函数时pipelined出现PLS-00653:在PL/SQL定义域内不允许有聚集/表函数网友说:在实际的应用中,为了让PL/SQL函数返回数据的多个行,必须通过返回一个REFCURSOR或一个数据集合来完成。REFCURSOR的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。9i通过引入的管道化表函数纠正了后一种情况。表函数是返回整个行的集(通常作为一个集合)的函数,可以直接从SQL语句中进行查询,就好像它是一个真正的数据库表一样。管道化表函数与之相似,但是它像在构建时一样返回数据,而不是一次全部返回。管道化表函数更加有效,

2、因为数据可以尽可能快地返回。自己总结:管道化表函数pipelined必须返回一个集合。在函数中,PIPEROW语句被用来返回该集合的单个元素,该函数必须以一个空的RETURN语句结束,以表明它已经完成。一旦我们创建了上述函数,我们就可以使用TABLE操作符从SQL查询中调用它。也就是实际操作当中我们需要是一个数据源而不仅是一张表所以用到管道化表函数,而且用这个函数在返回大数据时候传输的速度比较快。下面是有关pipelined在生活中的用遇到的一些问题:1.创建一个表类型的BcreateorreplacetypeTastableofvarchar(300)2.比如我们创建一个带

3、pipelied 管道函数返回一张表或一个数据源数据的函数AcreateorreplacefunctionA(parasvarchar2)returnTpipelinedisbegin....return;--注意这边直接返回就可以了endA;和创建一个不带该管道函数同样也返回一张表的类型的函数B。createorreplacefunctionB(parasvarchar2)returnTisvar_outT;begin....returnvar_out;--这边必须有个输出参数作为返回值endB;3.接下来我们创建一个存储过程C去调用A和Bcreateorreplacepr

4、ocedureC(parasvarchar2)isvar_outT;begin--方法(1)T:=A('parasValues');--这边调用带pipelined函数的函数A---直接报错PLS-00653:在PL/SQL定义域内不允许有聚集/表函数这是因为管道函数需要用TABLE操作符从SQL查询中调用它所以这边不能直接赋值这边要赋值可以这样修改selectA('parasValues')intoTfromdual;就可以--方法(2)T:=B('parasValues');--这边调用函数B....endC;难道是在存储过程中调用pipelined函数是不行的吗?答案:

5、是可以的。管道函数调用过程不能直接用":="进行赋值我们可以采用上面使用赋值方式selectA('parasValues')intoTfromdual;下面是提供一个完整管道函数拆分字符串代码我已经测试过没问题。pl/sql执行就OK--创建类型createorreplacetypetype_splitastableofvarchar2(50);--创建管道函数createorreplacefunctionsplit(p_listvarchar2,p_sepvarchar2:=',')returntype_splitpipelined--管道函数关键字isl_idxpls_i

6、nteger;v_listvarchar2(50):=p_list;beginloopl_idx:=instr(v_list,p_sep);ifl_idx>0thenpiperow(substr(v_list,1,l_idx-1));v_list:=substr(v_list,l_idx+length(p_sep));elsepiperow(v_list);exit;endif;endloop;return;endsplit;--测试改管道函数是否正确select column_value  from table(split('Hello,Cnblogs!',','));--

7、在存储过程调用运用该管道函数createorreplaceprocedureprc(paraoutvarchar2)isvar_outvarchar2(200);var_splittype_split;begin--调用方式一输出拆分的字符串forpin(select column_value  from table(split('Hello,Cnblogs!',',')))loopvar_out:=var_out

8、

9、p.column_value;endloop;--调用方式二输出拆分的字符串selec

显示全部收起
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭