- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Oracle应用管道函数时pipelined
Oracle 应用管道函数时 pipelined 出现PLS-00653:在 PL/SQL 定义域内不允许有聚集/表函数
网友说:在实际的应用中,为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。 9i 通过引入的管道化表函数纠正了后一种情况。表函数是返回整个行的集(通常作为一个集合)的函数,可以直接从 SQL 语句中进行查询,就好像它是一个真正的数据库表一样。管道化表函数与之相似,但是它像在构建时一样返回数据,而不是一次全部返回。管道化表函数更加有效, 因为数据可以尽可能快地返回。
自己总结:管道化表函数 pipelined 必须返回一个集合。在函数中,PIPE ROW 语句被用来返回该集合的单个元素,该函数必须以一个空的 RETURN 语句结束,以表明它已经完成。一旦我们创建了上述函数,我们就可以使用 TABLE 操作符从 SQL 查询中调用它。
也就是实际操作当中我们需要是一个数据源 而不仅是一张表 所以用到管道化表函数,而且用这个函数在返回大数据时候传输的速度比较快。
下面是有关 pipelined在生活中的 用遇到的一些问题:
1.创建一个表类型的B
create or replace type T as table of varchar 300
2.比如我们创建一个带pipelied?管道函数返回一张表或一个数据源数据的函数A
create or replace function A paras varchar2
return T pipelined
is
begin
....
return;--注意这边直接返回就可以了
end A;
和创建一个不带该管道函数同样也返回一张表的类型的函数B。
create or replace function B paras varchar2
return T
is
var_out T;
begin
....
return var_out;--这边必须有个输出参数作为返回值
end B;
3.接下来我们创建一个存储过程C 去调用A 和 B
create or replace procedure C paras varchar2
is
var_out T;
begin
-- 方法(1)
T: A parasValues ;--这边调用带pipelined 函数的函数A ---直接报错 PLS-00653: 在 PL/SQL 定义域内不允许有聚集/表函数
这是因为管道函数 需要用TABLE 操作符从 SQL 查询中调用它 所以这边不能直接赋值
这边要赋值可以这样修改
select A parasValues into T from dual; 就可以
-- 方法 (2)
T: B parasValues ;--这边调用函数B
....
end C;
难道是在存储过程中调用pipelined 函数是不行的吗?
答案:是可以的。管道函数调用过程不能直接用: 进行赋值
我们可以采用上面使用赋值方式select A parasValues into T from dual;
下面是提供一个完整管道函数拆分字符串 代码我已经测试过没问题 。pl/sql执行就OK
--创建类型
create or replace type type_split as table of varchar2 50 ;
--创建管道函数
create or replace function split p_list varchar2, p_sep varchar2 : , return type_split pipelined --管道函数关键字
is l_idx pls_integer; v_list varchar2 50 : 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 split;
--测试改管道函数是否正确
select column_value from table split Hello,Cnblogs!,, ;
--在存储过程调用运用该管道函数
create or replace procedure prc pa
您可能关注的文档
最近下载
- ABS 【2023】RULES FOR BUILDING AND CLASSING Mobile Offshore Units 移动式海上设备建造和入级规则。第5部分防火和安全。措施和特点.pdf
- 高栏港经济区荷包岛区域养殖项目环境影响报告书.pdf
- 2025年”三会一课“”主题党日“计划表.docx VIP
- 浙江省建筑施工企业三类人员(企业负责人A证)复习试题附答案(一).docx
- 数字化转型规划设计方案.pptx
- 行业标准:T∕CEEIA B218-2012 光伏发电系统用电缆 1~4部分.pdf
- 2024新能源光伏风电数据采集技术标准.docx
- 2025年部编版语文三年级下册期中专项复习 字词 试题(含答案).docx VIP
- 项目法人(建设单位)质量管理违规行为分类标准.docx
- synopsys学习资料-xa_cck_ref.pdf
文档评论(0)