循序渐进丨MogDB数据库中管道函数功能的实现

Oracle中有一个piped line函数类型,可以把一个函数的返回值以管道的形式返回,使用类似于:

create type typ_pipe is table of ..;create function test_fun ( .. ) return typ_pipe  pipelined as ...pipe row(...);end;/
select * from table(test_fun (...));

在MogDB数据库中也有类似的实现,主要是用到了函数定义中的RETURNS SETOF row,其基本语法如下:

create type typ_pipe is(...);create function test_fun ( .. )RETURNS SETOF typ_test_funas declarerec typ_pipe ;begin...rec := ...;RETURN NEXT rec;;end;/

其中的关键点在于定义中的RETURNS SETOF以及函数体中的RETURN NEXT,可以简单地认为就是Oracle中PIPELINED和PIPE ROW;另外,RETURN NEXT后面除了可以使用PLSQL中定义的变量,也可使用隐式游标for rec in (select … ) loop中的rec。

下面来看两个例子,分别用定义的变量和for loop隐式游标来返回。

01建立测试表和类型

drop table if exists test_table_fun;create table test_table_fun(id int,name varchar(20));
insert into test_table_fun select generate_series(1,100), 'test '||generate_series(1,100);
drop type if exists typ_test_fun ;create type typ_test_fun is(id int,name varchar(20));

02返回定义的变量的形式

create or replace function pipe_rows_test(n_rows int)RETURNS SETOF typ_test_fun AS $$ declare rec typ_test_fun;  BEGINrec .id :=0 ;rec.name :='line zero';return NEXT rec;for i in (select * from test_table_fun limit n_rows ) looprec.id = - i.id;rec.name = 'line '||i.name;RETURN NEXT rec;end loop;end;$$ LANGUAGE plpgsql;

03测试定义的变量的形式

MogDB=# select * from pipe_rows_test(3); id |    name     ----+-------------  0 | line zero -1 | line test 1 -2 | line test 2 -3 | line test 3(4 rows)

04

返回for loop隐式游标的形式

create or replace function pipe_rows_test_rec(n_rows int)RETURNS SETOF typ_test_fun AS $$declarec_rows int default 0;  BEGINfor i in (select * from test_table_fun ) loop c_rows := c_rows+1;RETURN NEXT i;exit when c_rows >= n_rows;end loop;end;$$ LANGUAGE plpgsql;

05测试返回for loop隐式游标的形式

MogDB=# select * from pipe_rows_test_rec(5); id |  name  ----+--------  1 | test 1  2 | test 2  3 | test 3  4 | test 4  5 | test 5(5 rows)

当然,以上两种形式并不冲突,混用也是也可以的,大家只需要理解RETURN NEXT关键字就相当于往返回的结果集中追加记录就可以了。

关于作者

罗海雄,云和恩墨数据库研发架构师,性能优化专家,2012年ITPUB全国SQL大赛冠军;拥有丰富的企业级系统设计与优化经验,对SQL优化h和理解尤其深入;曾服务于甲骨文公司。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/896765.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构6——树与二叉树

在本专栏的前五篇中,我们学习了顺序表、链表、栈和队列,他们本质上都是线性表。有线性表就存在非线性表,现在我们就来学习一下结构更复杂的非线性表——树。 1. 树的概念与结构 1.1 树的概念 树是一种非线性的数据结构,它是由n&…

Go语言Gin框架的常规配置和查询数据返回json示例

文章目录 路由文件分组查询数据库并返回jsonservice层controller路由运行效果 启动多个服务 在 上一篇文章《使用Go语言的gorm框架查询数据库并分页导出到Excel实例》 中主要给大家分享了较多数据的时候如何使用go分页导出多个Excel文件并合并的实现方案,这一篇文章…

Linux之远程连接服务器

远程连接服务器的类型 文字接口 明文传输:Telnet 23、RSH等,目前非常少用; 加密传输:SSH为主,已经取代明文传输 ssh提供两个服务器功能:1.类似于telnet;2.类似于ftp的sftp-serve…

特斯拉自动驾驶出租车计划变成泡影?联想与Meta合作,推出面向PC的个人AI智能体AI Now|AI日报

文章推荐 Swarms Corporation创始人Kye Gomez实锤OpenAI多智能体Swarm抄袭其成果!|AI日报 今日热点 中国海油“海能”人工智能模型正式发布 近日,由中国海油与中国电信、科大讯飞等企业合作打造“海能”人工智能模型正式推出。 中国海油“…

Centos7搭建minio对象存储服务器

Centos7搭建minio对象存储服务器 安装二进制程序配置服务文件 安装二进制程序 参考:https://segmentfault.com/q/1010000042181876 minio中国版:https://www.minio.org.cn/download.shtml#/linux # 下载二进制程序 wget https://dl.min.io/server/min…

鸿蒙--应用首次启动

最终效果 前言 基于自定义弹框、首选项和页面路由实现一个模拟应用首次启动的案例。需要完成以下功能: 实现四个页面,启动页、隐私协议页、广告页和应用首页。实现自定义隐私协议弹窗,点击协议可查看隐私协议具体内容。页面间的路由跳转。相关概念 首选项:首选项为应用提供…

软件工程:图书管理系统甘特图

1 实验目的 熟悉GanttProject 软件环境,能够使用GanttProject绘制甘特图,进行项目管理与规划。 2 实验内容 为小型图书管理系统项目的实施计划绘制甘特图。 小型图书管理系统项目包含登录、浏览、管理读者、管理图书资料、管理书目、登记借书、登记还书、预定图书、…

Snort浅析

Snort简介 Snort是免费开源的IDS/IPS(入侵检测/防御系统)系统,于1998年开发,旨在检测和响应网络中的可疑活动。包含流量/协议分析、内容匹配等功能,并可用预定义规则检测和防止各种攻击。官方网站:https:/…

出口摩洛哥提示 | 燃气器具和设备,2024年12月20日起需要标识Cmim Mark

Cmim Mark 为了证明产品符合摩洛哥的技术法规及标准,指导消费者正确选购,并协助政府有效管理市场,所有依据第24-09号法律规定的产品,必须加贴清晰的Cmim Mark,方可顺利进入摩洛哥市场。 根据摩洛哥官方公报发布的关于…

K歌与露营最搭配,AISON爱畅K歌音箱让露营更有趣

据市场调研数据显示,中国露营经济核心市场规模和带动市场规模均呈现逐年上升趋势,预计到2025年,中国露营经济核心市场规模将达到2483.2亿元。同时,《2024小红书搜索推广白皮书》显示,城市出行、音乐、旅游和户外等娱乐…

redis的配置文件redis.conf解析

我的后端学习大纲 我的Redis学习大纲 1.1.Redis的配置文件: 1.Redis的配置文件名称是:redis.conf 2.在vim这个配置文件的时候,默认是不显示行号的,可以编辑下面这个文件,末尾加上set nu,就会显示行号: 1.…

STM32应用详解(5)USART串口初始化

文章目录 一、USART初始化二、代码说明1.原理图2.main函数3.USART串口初始化函数4.代码整体结构 三、USART串口初始化总结 一、USART初始化 所谓的对USART进行初始化,就是对USART固件库函数的调用,来完成串口(USART)的设置,比如设置波特率、…

Docker 搭建mysql

拉取mysql镜像 docker pull mysql # 拉取镜像 [rooteason ~]# docker pull mysql Using default tag: latest latest: Pulling from library/mysql 72a69066d2fe: Pull complete 93619dbc5b36: Pull complete 99da31dd6142: Pull complete 626033c43d70: Pull complete 37d…

开放式耳机什么品牌最好?热门开放式蓝牙耳机推荐!

如今,开放式耳机如雨后春笋般涌现,丰富的产品类型确实让不少消费者陷入了选择的困境。很多人不知道哪个牌子的耳机好用,不过别担心,我精心搜罗了一批兼具时尚外观与卓越性能的开放式耳机。作为有着多年音频设备研究经验的专业人士…

sql server 行转列及列转行

图1 图2 1.行转列 (图1->图2) 1.方法一 (数据库通用),使用max 加case when 函数 -- 行转列 图1->图2 SELECT name,MAX(CASE WHEN subject语文 THEN score ELSE 0 END) AS "语文",MAX(CASE WHEN subject数学 …

OpenAI GPT-o1实现方案记录与梳理

本篇文章用于记录从各处收集到的o1复现方案的推测以及介绍 目录 Journey Learning - 上海交通大学NYUMBZUAIGAIRCore IdeaKey QuestionsKey TechnologiesTrainingInference A Tutorial on LLM Reasoning: Relevant methods behind ChatGPT o1 - UCL汪军教授Core Idea先导自回归…

64页精品PPT | 汽车经销商数据应用解决方案

汽车经销商正面临前所未有的盈利能力挑战。从18年起 ,传统燃油车汽车行业开始步入低速增长阶段 ,卖车已经挣不到钱 ,利润往往来自任务完成的厂家返利;新兴的直营模式的出现 ,冲击了传统授权经销的方式 ,疫情…

【JS】双指针法获得满足四数之和且不重复的四元组

思路 本题做法与上一篇三数相加的做法相似,同样是使用双指针法,区别是这里多嵌一层循坏,遍历 i 和 j 的值( j i 1),思路可参考笔记: 【JS】双指针法获得满足三数之和且不重复的三元组https://…

Git合并多个分支中的提交内容

IDEA中使用 IEAD编辑器中使用Git IEAD编辑器中使用Git 案例一: 把test分支的其中提交的内容合并到main分支上。 你现在通过IDEA开发的分支是test分支,当你在test分支把内容都写完了并且提交内容保存到了本地的git暂存区中的时候,如果此时你的…

【JAVA毕业设计】基于Vue和SpringBoot的员工绩效考核系统

本文项目编号 T 021 ,文末自助获取源码 \color{red}{T021,文末自助获取源码} T021,文末自助获取源码 目录 一、系统介绍1.1 业务分析1.2 用例分析 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行…