【Oracle】 管道函数pipelined function简单的使用
Oracle 管道函数pipelined function简单的使用
如果在函数(function)中加关键字 pipelined,就表明这是一个oracle管道函数,其返回值类型必为 集合,体现出来的数据结构类似于表,即可以理解成,使用管道函数可以返回一张查询表,可以是单行数据也可以是多行数据,而不是平常函数返回的单行数据
这种返回多行数据在需要大数据量处理的时候很有用,比如这一段SQL可能全部查询出来要一分钟,但是使用这个方法可能很快就有数据,虽然不是全部,但是有的时候不需要一次性获取全部数据的时候是一种好方法
且在复杂的方法下更好地去处理一些复杂的逻辑查询
要使用管道函数的话需要先进行一下类型的类型的创建
首先我们创建一个类型对象
CREATE OR REPLACE Type test_Row_Type As Object
(
test1 Varchar2(512),
test2 Varchar2(3000),
test3 Varchar2(3000),
test4 Varchar2(3000),
test5 Varchar2(3000),
test6 Number,
test7 Number
)
然后我们创建嵌套的表
CREATE OR REPLACE TYPE test_Row_Type_TABLE AS TABLE OF test_Row_Type;
接下来创建一个临时表,用来测试数据
create table TTTtable
(
aaa VARCHAR2(50),
bbb VARCHAR2(50),
ccc VARCHAR2(50)
)
其中数据如下

然后我们开始写管道函数
CREATE OR REPLACE FUNCTION test_Row_pipelined(p_varchar in varchar2)
return test_Row_Type_TABLE
--关键字加在这里
pipelined as
p_num integer := 0;
ret test_Row_Type;
begin
--查询临时表数据
for sub_data in (select t.bbb, t.ccc
from TTTtable t
where t.aaa = p_varchar) loop
p_num := p_num + 1;
ret := test_Row_Type(p_num,
sub_data.bbb,
sub_data.ccc,
'',
'',
0,
0);
--将数据放入管道,pipe row()语法被用来返回该集合的单个元素
pipe row(ret);
end loop;
--函数使用一个空的return结束
return;
end;
如果是使用
select test_Row_pipelined('a') from dual
则返回的是<Collection>数据,此时在PL/SQL中打开就是这样的

同时,我们还可以使用这种语法
select * from table(test_Row_pipelined('a')) t
结果也是这样的,不过推荐使用这种方法,因为这种方式是可以使用where条件去进行过滤的
比如我们加上where
select t.* from table(test_Row_pipelined('a')) t where t.test1 = 1
则得到的结果就是这样的

这就是管道函数的最基本的用法
PS:在管道函数中可以进行DML操作,一般要加自治事务处理,但是不能直接对管道函数结果集进行DML操作,如果要对管道函数进行DML操作,建议做成视图再加触发器
使用管道函数制作分割函数的部分放在了这里
具体实现逻辑:
CREATE OR REPLACE FUNCTION test_Row_pipelined(p_insvar in varchar2,
p_delimiter in varchar2)
return test_Row_Type_TABLE
pipelined as
p_num integer := 1;
p_num1 integer;
p_length integer;
p_start integer := 1;
p_varchar varchar2(200);
ret test_Row_Type;
begin
--如果不是以分隔符结尾的,就拼接上去
select case
when (select count(1)
from dual
where p_insvar like '%' || p_delimiter) > 0 then
p_insvar
else
p_insvar || p_delimiter
end
into p_varchar
from dual;
--整个字符串的长度
select length(p_varchar) into p_length from dual;
--当起始长度大于整体长度的时候
while (p_start <= p_length) loop
--找到字符串与分隔符的分割后的下标
select instr(p_varchar, p_delimiter, p_start) into p_num1 from dual;
--如果没有,则返回全部字符串,说明到了结尾了
if p_num1 = 0 then
ret := test_Row_Type(p_num,
substr(p_varchar, p_start),
p_num1,
p_start,
p_length,
0,
0);
pipe row(ret);
else
--否则,截取字符传中,从p_start开始找到下标减去p_start的部分
ret := test_Row_Type(p_num,
substr(p_varchar, p_start, p_num1 - p_start),
p_num1,
p_start,
p_length,
0,
0);
pipe row(ret);
--新的起始点为下标加1
p_start := p_num1 + 1;
end if;
--序号加1
p_num := p_num + 1;
end loop;
return;
end;
20230908更新
管道函数在存储过程中作为循环的数据集使用的时候,debug时可能会在pipe row的时候出现奇怪的报错,比如出现01422(一行返回多行或为空)这种根本没关系的报错
这种情况下,需要查看存储过程中是不是存在这种bug,通常情况下都能在后面语句中找到,不知道为什么会导致报错提前,挺奇怪的
【Oracle】 管道函数pipelined function简单的使用的更多相关文章
- 管道函数(pipelined function)简单使用示例
-----------------------------Cryking原创------------------------------ -----------------------转载请注明出处, ...
- 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类. ...
- oracle trim函数用法详解
在oracle数据库中,trim一般都是用在删除字符串两边的空格.实际上,trim也可以用来删除字符串两边的指定字符.并且trim指定删除的字符串只能是单个字符Oracle TRIM函数是很常见的函数 ...
- ORACLE实用函数之一 ratio_to_report的简单使用
应用场景: 查询学生成绩级别(ABCDE)个人数和所占百分比(案列简单,勿喷). 表结构: create or replace table stu_grade( id varchar2(36), le ...
- 管道函数(%>%)很简单
%>%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以大量减少内存中的对象,节省内存 符号%>%,这是管道操作,其意思是将%> ...
- Oracle中函数/过程返回结果集的几种方式
原文 Oracle中函数/过程返回结果集的几种方式 Oracle中函数/过程返回结果集的几种方式: 以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过. ...
随机推荐
- EL1008E: Property or field 'timestamp' cannot be found on object of type 'java.util.HashMap' - maybe not public-请求springboot-后台报错
一.问题由来 自己在使用node.js写的前端项目访问springBoot访问的后端项目的时候,springboot项目中报这个错,抛出这个异常. 详细的错误信息如下: Servlet.service ...
- vue-helper 导致找到2个函数定义,跳转需要多点一下,禁用vue-helper即可
vue-helper 导致找到2个函数定义,跳转需要多点一下,禁用vue-helper即可
- manjaro配置软件源
sudo pacman-mirrors -i -c China -m rank从中选择最快的软件源!
- .NET Aspire Preview 4 发布!
.NET Aspire是一个有态度的云原生应用开发框架,旨在改善生成.NET云原生应用的体验,并提供一组强大的工具来帮助你生成和运行分布式应用.它允许开发者快速创建属于自己的云原生应用,或改造已有的项 ...
- python高级技术(网络编程二)
一 粘包现象(基于TCP协议实现远程执行命令) 1.TCP协议,会出现粘包现象 例:ipconfig命令,客户端收到的字符串比较短,客户端能够收完整, tasklist命令,客户端收到的字符串超过10 ...
- 三维模型3DTile格式轻量化纹理压缩技术方法浅析
三维模型3DTile格式轻量化纹理压缩技术方法浅析 三维模型的纹理数据通常占据了模型数据的大部分,因此纹理压缩对于3DTile格式轻量化压缩来说至关重要.下面将详细分析几种主要的纹理压缩技术方法: D ...
- SpringBoot3集成PostgreSQL
标签:PostgreSQL.Druid.Mybatis.Plus: 一.简介 PostgreSQL是一个功能强大的开源数据库系统,具有可靠性.稳定性.数据一致性等特点,且可以运行在所有主流操作系统上, ...
- 从0开始设计_基于STM32F1的RC522读写卡
从0开始设计_基于STM32F1的RC522读写卡 1.介绍看网上很多RC522的教程都是基于读卡ID的,这个对于很多应用来说其实没有什么用,最近刚好有个项目需要读写卡,而RC522又是非常常用的且不 ...
- 移动端弹性布局方案lib-flexible实践
2个月前,写过一篇文章<从网易与淘宝的font-size思考前端设计稿与工作流>总结过一些移动web中有关手机适配的一些思路,当时也是因为工作的关系分析了下网易跟淘宝的移动页面,最后才有那 ...
- IDEA 突然无法打开 解决办法
如果实在没有方法了可以试一试 删除所有的配置文件,默认位置C:\Users\${你的用户名}\${.IntelliJIdea+版本} 注意:删除配置后之前所有的设置都会失效,谨慎操作.