管道函数(pipelined function)简单使用示例
管道函数是一种比较特殊的函数,其返回值为集合类型.
在PL/SQL中,管道函数和表函数、游标一起联合使用能实现一些比较复杂的功能,当和并行处理一起使用时,还能较大的改善性能.
使用示例1:
实现简单的字符串分割,函数参数为常见的VARCHAR2类型.
--先创建集合类型,供管道函数返回使用
23:38:14 SCOTT@orcl> CREATE OR REPLACE TYPE EMP_element as table of varchar2(100);
23:54:04 2 / Type created. Elapsed: 00:00:00.11
建立管道函数
create or replace function pipe_test(p_empno varchar2,
p varchar2 default ',')
return EMP_element
pipelined is
v_element varchar2(1000) := p_empno;
begin
pipe row(substr(p_empno, 0, instr(p_empno, p) - 1));
loop
v_element := substr(v_element,
instr(v_element, p) + 1,
length(v_element) - instr(v_element, p) + 1);
exit when instr(v_element, p) = 0;
pipe row(substr(v_element, 0, instr(v_element, p) - 1));
end loop;
pipe row(v_element);
return;
end pipe_test;
注意pipelined及pipe row等关键字.
pipelined表明该函数为管道函数,pipe row用来立即返回单个元素.
使用如下:
01:06:16 SCOTT@orcl> select pipe_test(empno||','||ename) a from emp; A
------------------------------
EMP_ELEMENT('7369', 'SMITH')
EMP_ELEMENT('7499', 'ALLEN')
EMP_ELEMENT('7521', 'WARD')
EMP_ELEMENT('7566', 'JONES')
EMP_ELEMENT('7654', 'MARTIN')
EMP_ELEMENT('7698', 'BLAKE')
EMP_ELEMENT('7782', 'CLARK')
EMP_ELEMENT('7788', 'SCOTT')
EMP_ELEMENT('7839', 'KING')
EMP_ELEMENT('7844', 'TURNER')
EMP_ELEMENT('7876', 'ADAMS')
EMP_ELEMENT('7900', 'JAMES')
EMP_ELEMENT('7902', 'FORD')
EMP_ELEMENT('7934', 'MILLER') 14 rows selected. Elapsed: 00:00:00.04
即每一行为一个集合变量.
也可以通过表函数查询单个集合元素的值:(这里可看作一种单行转单列的应用)
01:07:28 SCOTT@orcl> select * from table( select pipe_test(empno||','||ename) A
from emp where empno=7788); COLUMN_VALUE
--------------------------------------------------
7788
SCOTT 2 rows selected. Elapsed: 00:00:00.01
使用示例2:
使用集合类型做函数传入参数类型.
建立函数如下:
create or replace function pipe_test1(c_empno EMP_element,
p varchar2 default ',')
return EMP_element
pipelined is
v_element varchar2(1000);
begin
for i in 1 .. c_empno.count loop
v_element := c_empno(i);
pipe row(substr(v_element, 0, instr(v_element, p) - 1));
loop
v_element := substr(v_element,
instr(v_element, p) + 1,
length(v_element) - instr(v_element, p) + 1);
exit when instr(v_element, p) = 0;
pipe row(substr(v_element, 0, instr(v_element, p) - 1));
end loop;
pipe row(v_element);
end loop;
return;
end pipe_test1;
注意嵌套表类型的使用.
使用与上面的基本类似:
01:13:16 SCOTT@orcl> col a format a50
01:13:22 SCOTT@orcl> select pipe_test1(EMP_element(ename||','||'ename',empno||',
'||'empno')) a from emp; A
--------------------------------------------------
EMP_ELEMENT('SMITH', 'ename', '7369', 'empno')
EMP_ELEMENT('ALLEN', 'ename', '7499', 'empno')
EMP_ELEMENT('WARD', 'ename', '7521', 'empno')
EMP_ELEMENT('JONES', 'ename', '7566', 'empno')
EMP_ELEMENT('MARTIN', 'ename', '7654', 'empno')
EMP_ELEMENT('BLAKE', 'ename', '7698', 'empno')
EMP_ELEMENT('CLARK', 'ename', '7782', 'empno')
EMP_ELEMENT('SCOTT', 'ename', '7788', 'empno')
EMP_ELEMENT('KING', 'ename', '7839', 'empno')
EMP_ELEMENT('TURNER', 'ename', '7844', 'empno')
EMP_ELEMENT('ADAMS', 'ename', '7876', 'empno')
EMP_ELEMENT('JAMES', 'ename', '7900', 'empno')
EMP_ELEMENT('FORD', 'ename', '7902', 'empno')
EMP_ELEMENT('MILLER', 'ename', '7934', 'empno') 14 rows selected. Elapsed: 00:00:00.01
01:14:02 SCOTT@orcl> select * from table(select pipe_test1(EMP_element(ename||',
'||'ename',empno||','||'empno')) from emp where empno=7788); COLUMN_VALUE
--------------------------------------------------
SCOTT
ename
7788
empno 4 rows selected. Elapsed: 00:00:00.02
还可以用游标做管道函数的传入参数类型,这里就不演示了,留给大家自己去练习!
管道函数使用注意项:
1.返回类型必须是集合类型,否则会报错:PLS-00630
2.在声明部分(定义部分)不能使用管道函数(也不能定义管道函数),否则会报错:PLS-00653
管道函数(pipelined function)简单使用示例的更多相关文章
- Oracle管道函数(Pipelined Table Function)介绍
一 概述: 1.管道函数即是能够返回行集合(能够使嵌套表nested table 或数组 varray)的函数,我们能够像查询物理表一样查询它或者将其 赋值给集合变量. 2.管道函数为并行运行,在普 ...
- Oracle管道函数(Pipelined Table Function)实现的实例
1. 简单的例子(返回单列的表) 1>创建一个表类型 create or replace type t_table is table of number; 2>创建函数返回上面定义的类型 ...
- oracle管道函数的用法
oracle管道函数是一类特殊的函数,oracle管道函数返回值类型必须为集合,下面将介绍oracle管道函数的语法. 在普通的函数中,使用dbms_output输出的信息,需要在服务器执行完整个函数 ...
- oracle管道函数的用法(一行拆为多行)
oracle管道函数是一类特殊的函数,oracle管道函数返回值类型必须为集合 如果需要在客户端实时的输出函数执行过程中的一些信息,在oracle9i以后可以使用管道函数(pipeline funct ...
- Oracle管道函数示例
Oracle的管道函数需要定义下面的三样: Record/Object Type:定义一个Record或Object类型的变量,这个变量用于表示返回结果集的一行数据,有点像C#中的DataRow类. ...
- 管道函数(%>%)很简单
%>%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以大量减少内存中的对象,节省内存 符号%>%,这是管道操作,其意思是将%> ...
- 【转】PowerShell 函数(Function)
转至:http://blog.csdn.net/kk185800961/article/details/49022395 函数基本操作: [plain] view plain copy #创建函数 F ...
- EasyHook远注简单监控示例 z
http://www.csdn 123.com/html/itweb/20130827/83559_83558_83544.htm 免费开源库EasyHook(inline hook),下面是下载地址 ...
- R语言(自定义函数、循环语句、管道函数)
学习R语言半年多了,以前比较注重统计方法上的学习,但是最近感觉一些基础知识也很重要.去年的参考资料是<R语言实战>,今年主要是看视频.推荐网易云课堂里的教程,很多资料都是很良心的~ 目前学 ...
随机推荐
- Android高效的应用程序开发工具集1---ant构建一个简单的Android工程
在java编译那些事通过提到ant编译Java工程,如今扩大到用它来构建Android目,事实上道理是相通的.变化的仅仅是使用的形式.ant构建相比IDE的优点是多个子项目使用自己定义jar包时,an ...
- 【 D3.js 进阶系列 — 5.0 】 直方图
直方图用于描写叙述概率分布,D3 提供了直方图的布局 Histogram 用于转换数据. 假设有数组 a = [10, 11, 11.5, 12.5, 13, 15, 19, 20 ],如今把10~2 ...
- 基于NHibernate二级缓存的MongoDB组件
设计一套基于NHibernate二级缓存的MongoDB组件(上) 摘要:NHibernate Contrib 支持很多第三方的二级缓存,如SysCache,MemCache,Prevalence ...
- .NET 开源了,Visual Studio 开始支持 Android 和 iOS 程序编写并自带 Android 模拟器
.NET 开源了,Visual Studio 开始支持 Android 和 iOS 程序编写并自带 Android 模拟器 北京时间今天凌晨的 Connect(); 大会上,多少程序员的假想成为现实. ...
- 异步陷阱之IO
异步陷阱之IO篇 很多教程和资料都强调流畅的用户体验需要异步来辅助,核心思想就是保证用户前端的交互永远有最高的优先级,让一切费时的逻辑通通放到后台,等到诸事完备,通知一下前端给个提示或者继续下一步.随 ...
- 一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10(转载)
在网站开发中不免因为各种兼容问题苦恼,针对兼容问题,其实IE给出了解决方案Google也给出了解决方案百度也应用了这种方案去解决IE的兼容问题 百度源代码如下 <!Doctype html> ...
- Visual Studio 当前不会命中断点的问题
这个问题一般有两个版本 1.当前不会命中断点,还没有为该文档加载任何符号. 2.当前不会命中断点,源代码与原始版本不同. 要解决第一个问题,就要了解一种文件格式“PDB(Program DataBas ...
- Windows上memcached的使用
Memcached是什么?Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度. Memcached能缓存什 ...
- Object Pool
设计模式之美:Object Pool(对象池) 索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 意图 运用对象池化 ...
- strlen与sizeof有什么区别?
其实二者的区别还是很大的,首先strlen计算的长度不包括字符串最后的终止null字节, 而sizeof则计算包括终止null的缓冲区长度.还有一点很容易被忽略,strlen需要一次函数调用, 即它是 ...