【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测试通过. ...
随机推荐
- gitee 流水线 定时触发 不能用,不能白嫖了
gitee 流水线 定时触发 不能用,不能白嫖了 白研究半天了,只好回去拿centos服务器 搞定时任务了
- centos 添加 公钥,root不用输入密码 ssh-keygen
centos 添加 公钥,root不用输入密码 ssh-keygen -t rsa -C "yourEmail" 一通回车后,生成 C:\Users\Reciter/.ssh/id ...
- IDEA/Android Studio的gradle控制台输出中文乱码问题解决
原文地址: IDEA/Android Studio的gradle控制台输出中文乱码问题解决 - Stars-One的杂货小窝 在项目中,有使用到Gradle自定义脚本,会有些输出日志,但是输出中文就变 ...
- 【Mahjong hdu 枚举】搜索枚举
#####枚举 import java.io.*; import java.util.*; public class Main { static HashSet<String> set1; ...
- 关于进程同步与互斥的一些概念(锁、cas、futex)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明 无 前言 最近为了实现在android lin ...
- View之Canvas,Paint,Matrix,RectF等介绍
目录介绍 1.Paint画笔介绍 1.1 图形绘制 1.2 文本绘制 2.Canvas画布介绍 2.1 设置属性 2.2 画图[重点] 2.3 Canvas对象的获取方式 2.4 Canvas的作用 ...
- npm ERR! code ENOENT npm ERR! syscall open npm ERR! path C:\Users\shuzi\Desktop\保密文件项目\test-ui/package.json npm ERR! errno -4058
打开一个新的项目,因为当前项目文件夹下没有npm,"dev": "npm run start:dev",所以所以没有展示对应的运行图,如下图: 打开一个新的前端 ...
- 【Leetcode】120. 三角形最小路径和
题目(链接) 给定一个三角形triangle ,找出自顶向下的最小路径和. 每一步只能移动到下一行中相邻的结点上.相邻的结点在这里指的是下标与上一层结点下标相同或者等于上一层结点下标 + 1的两个结点 ...
- 介绍几款WPF应用的UI库
在WPF中对于前端页面的书写,我们有现成的UI类库,不需要我们自己再去写 我这里介绍几款 1.MahApps 官网 https://mahapps.com/ 使用,在App.xaml中添加 <A ...
- 阿里二面:Java中锁的分类有哪些?你能说全吗?
引言 在多线程并发编程场景中,锁作为一种至关重要的同步工具,承担着协调多个线程对共享资源访问秩序的任务.其核心作用在于确保在特定时间段内,仅有一个线程能够对资源进行访问或修改操作,从而有效地保护数据的 ...