(PG数据库函数写法(存储过程))

01-PostgreSQL 存储过程的基本介绍以及入门(基本结构、声明和赋值、控制结构) PostgreSQL 存储过程的开发指南,含基本结构、声明和赋值、控制结构 阅读详情
AI摘要

本文详细介绍了PostgreSQL函数/存储过程返回数据集的方法,包括直接使用SQL查询、PL/pgSQL块返回查询结果、使用自定义类型及OUT参数返回复杂数据集,并展示了如何根据不同输入返回不同结果集。

**

(PG数据库函数写法(存储过程))

**

以下主要介绍PostgreSQL函数/存储过程返回数据集,或者也叫结果集的示例。

背景: PostgreSQL里面没有存储过程,只有函数,其他数据库里的这两个对象在PG里都叫函数。 函数由函数头,体和语言所组成,函数头主要是函数的定义,变量的定义等,函数体主要是函数的实现,函数的语言是指该函数实现的方式,目前内置的有c,plpgsql,sql和internal,可以通过pg_language来查看当前DB支持的语言,也可以通过扩展来支持python等

函数返回值一般是类型,比如return int,varchar,返回结果集时就需要setof来表示。

一、数据准备
create table department(id int primary key, name text);
create table employee(id int primary key, name text, salary int, departmentid int references department);

insert into department values (1, ‘Management’),(2, ‘IT’),(3, ‘BOSS’);

insert into employee values (1, ‘kenyon’, 30000, 1);
insert into employee values (2, ‘francs’, 50000, 1);
insert into employee values (3, ‘digoal’, 60000, 2);
insert into employee values (4, ‘narutu’, 120000, 3);
二、例子
1.sql一例
create or replace function f_get_employee()
returns setof employee
as
s e l e c t ∗ f r o m e m p l o y e e ; select * from employee; select∗fromemployee;
language ‘sql’;
等同的另一个效果(Query)
create or replace function f_get_employee_query()
returns setof employee
as
b e g i n r e t u r n q u e r y s e l e c t ∗ f r o m e m p l o y e e ; e n d ; begin return query select * from employee; end; beginreturnqueryselect∗fromemployee;end;
language plpgsql;
查询图解如下
postgres=# select * from f_get_employee();
id | name | salary | departmentid
----±-------±-------±-------------
1 | kenyon | 30000 | 1
2 | francs | 50000 | 1
3 | digoal | 60000 | 2
4 | narutu | 120000 | 3
(4 rows)
查询出来的函数还可以像普通的表一样按条件查询 ,但如果查询的方式不一样,则结果也不一样,以下查询方式将会得到类似数组的效果
postgres=# select f_get_employee();
f_get_employee

(1,kenyon,30000,1)
(2,francs,50000,1)
(3,digoal,60000,2)
(4,narutu,120000,3)
(4 rows)
因为返回的结果集类似一个表的数据集,PostgreSQL还支持对该函数执行结果进行条件判断并过滤
postgres=# select * from f_get_employee() where id >3;
id | name | salary | departmentid
----±-------±-------±-------------
4 | narutu | 120000 | 3
(1 row)
上面的例子相对简单,如果要返回不是表结构的数据集该怎么办呢?看下面

2.返回指定结果集
a.用新建type来构造返回的结果集
–新建的type在有些图形化工具界面中可能看不到,
要查找的话可以通过select * from pg_class where relkind='c’去查,c表示composite type

create type dept_salary as (departmentid int, totalsalary int);

create or replace function f_dept_salary()
returns setof dept_salary
as
d e c l a r e r e c d e p t s a l a r y b e g i n f o r r e c i n s e l e c t d e p a r t m e n t i d , s u m ( s a l a r y ) a s t o t a l s a l a r y f r o m f g e t e m p l o y e e ( ) g r o u p b y d e p a r t m e n t i d l o o p r e t u r n n e x t r e c ; e n d l o o p ; r e t u r n ; e n d ; declare rec dept_salary%rowtype; begin for rec in select departmentid, sum(salary) as totalsalary from f_get_employee() group by departmentid loop return next rec; end loop; return; end; declarerecdepts​alarybeginforrecinselectdepartmentid,sum(salary)astotalsalaryfromfg​ete​mployee()groupbydepartmentidloopreturnnextrec;endloop;return;end;
language ‘plpgsql’;
b.用Out传出的方式
create or replace function f_dept_salary_out(out o_dept text,out o_salary text)
returns setof record as
d e c l a r e v r e c r e c o r d ; b e g i n f o r v r e c i n s e l e c t d e p a r t m e n t i d a s d e p t i d , s u m ( s a l a r y ) a s t o t a l s a l a r y f r o m f g e t e m p l o y e e ( ) g r o u p b y d e p a r t m e n t i d l o o p o d e p t : = v r e c . d e p t i d ; o s a l a r y : = v r e c . t o t a l s a l a r y ; r e t u r n n e x t ; e n d l o o p ; e n d ; declare v_rec record; begin for v_rec in select departmentid as dept_id, sum(salary) as total_salary from f_get_employee() group by departmentid loop o_dept:=v_rec.dept_id; o_salary:=v_rec.total_salary; return next; end loop; end; declarevr​ecrecord;beginforvr​ecinselectdepartmentidasdepti​d,sum(salary)astotals​alaryfromfg​ete​mployee()groupbydepartmentidloopod​ept:=vr​ec.depti​d;os​alary:=vr​ec.totals​alary;returnnext;endloop;end;
language plpgsql;
执行结果:
postgres=# select * from f_dept_salary();
departmentid | totalsalary
--------------±------------
1 | 80000
3 | 120000
2 | 60000
(3 rows)

postgres=# select * from f_dept_salary_out();
o_dept | o_salary
--------±---------
1 | 80000
3 | 120000
2 | 60000
(3 rows)
c.根据执行函数变量不同返回不同数据集
create or replace function f_get_rows(text) returns setof record as
KaTeX parse error: Can't use function '$' in math mode at position 67: …ct * from ' || $̲1 loop return n…
language ‘plpgsql’;
执行结果:
postgres=# select * from f_get_rows(‘department’) as dept(deptid int, deptname text);
deptid | deptname
--------±-----------
1 | Management
2 | IT
3 | BOSS
(3 rows)

postgres=# select * from f_get_rows(‘employee’) as employee(employee_id int, employee_name text,employee_salary int,dept_id int);
employee_id | employee_name | employee_salary | dept_id
-------------±--------------±----------------±--------
1 | kenyon | 30000 | 1
2 | francs | 50000 | 1
3 | digoal | 60000 | 2
4 | narutu | 120000 | 3
(4 rows)
这样同一个函数就可以返回不同的结果集了,很灵活。

参考:http://bbs.pgsqldb.com/client/post_show.php?zt_auto_bh=53950

来源:https://my.oschina.net/Kenyon/blog/108303

进阶数据库系列(十一):PostgreSQL 存储过程 在 PostgreSQL 中,除了标准 SQL 语句之外,通过创建复杂的过程和函数来满足程序需要,我们称为存储过程和自定义函数(User-Defined Function)。它有助于您执行通常在数据库中的单个函数中进行多次查询和往返操作的操作。 阅读详情

相关推荐

postgresql 函数返回结果集(一)

参考文章: Postgres函数返回自定义数据集--返回自定义的TABLE结构 传入整个sql,自定义函数 根据上面2个文章,就可以实现 传入变量 编写sql return table多行数据 当前sql在datagrip界面操作,实现目标: 如果用户选择了开始时间(2015rq_s)和结束时间(2019rq_e),则需要变成下面的效果 sql,范围是最长5年 ​select d.nf from (select regexp_split_to_table(test.nf...

Sicily_winner的博客 3521

PG Sql-存储过程编写

PG SQL-自定义存储过程语法格式 无参存储过程: CREATE OR REPLACE FUNCTION funName() RETURNS "pg_catalog"."void" AS $BODY$ DECLARE pro1 type1;-- pro1为自定义变量名,type1为变量类型,可以是integer,varchar,record。 ··· BEGIN pro1 :=XXX;-- 变量赋值,注意不要直接等于,赋值格式是冒号+等号,即“:=” -- To Do Something...

IWinds的博客 1万+

海山数据库(He3DB)源码详解:主备复制pg_wal_replay_resume

周雨慧 中移(苏州)软件技术有限公司 数据库内核开发工程师周雨慧 中移(苏州)软件技术有限公司 数据库内核开发工程师。

jkl13633534809的博客 808

PostgreSQL的函数及存储过程的基本使用

postgre存储过程新手入门级教程。存储过程的基本结构和调用。存储过程变量赋值。存储过程if语句、for语句使用...

Mr_Door的博客 4万+

postgresql|数据库|系统性能监控视图pg_stat与postgresql数据库的调优(备忘)

摘要:本文详细介绍了PostgreSQL数据库中的pg_stat族系统视图,这些视图对数据库监控和性能调优至关重要。文章重点讲解了pg_stat_database、pg_stat_user_tables、pg_stat_user_indexes等核心视图的功能和使用场景,包括如何通过这些视图分析事务提交/回滚情况、索引使用效率、表膨胀问题等。同时对比了openGauss与PostgreSQL在系统视图上的差异,指出正确使用这些视图可以帮助DBA及时发现数据库性能问题,如死锁、全表扫描、索引冗余等。

zsk_john的技术分享专用博客 1562

【0405】Postgres内核 CREATE DATABASE database-name 源码实现 ③ (向 pg_database 插入一个新元组(new tuple))

在 pg_database 中插入一个新的元组。这确立了我们对新数据库名称的所有权(任何其他人尝试插入相同的名称都会在唯一索引上被阻塞,并在我们提交后失败)。

Postgres 数据库内核开发工程师 405

PG获取存储过程及函数内容

根据函数或存储过程名获取pg库函数或存储过程具体内容

weixin_44529319的博客 2464

基础矩阵、本质矩阵、单应矩阵

基础矩阵是一个 3×3 的秩为2的矩阵,用于描述两个不同视图(或称为图像)之间对应点的几何约束。更具体地说,如果你有两幅图像,分别从两个不同的相机或者相机位置拍摄,那么基础矩阵可以用于找到一个图像中的点在另一个图像中的对应点。本质矩阵也是一个 3×3 的秩为2的矩阵,与基础矩阵非常类似。当两个视图(图像)之间的场景是一个平面或者两个视图之间仅有旋转和平移时,可以使用单应矩阵来关联这两个视图。这三个矩阵都是在计算机视觉中广泛应用的基础工具,但它们适用于不同类型的视图和场景。给定两个图像中的一对对应点。

Gloamirror的博客 1329

海山数据库(He3DB)源码解读:海山PG 词法、语法分析

查询分析中词法分析和语法分析分别借助词法分析工具Lex和语法分析工具 Yacc来完成各自的工作。exec_simple_query函数(在src/backend/tcop/postgres.c下)调用函数pg_parse_query进入词法分析和语法分析的主过程,函数pg_parse_query再调用词法分析和语法分析的入口函数raw_parser生成分析树;函数pg_parse_query返回分析树(raw_parsetree_list)给exec_simple_query;

于巍,花名漠雪,移动云数据库技术委员会主任,海山数据库研发负责人,PG中文社区常委,PG中文社区海外联络人。15年数据库内核研发经验,4年美国、以色列等海外研发经历,华为GaussDB、阿里云PolarDB、移动云He3DB等核心架构 1182

R链式中介:如何一次性生成4个变量所有可能的链式中介结果?(含结果解读与粗略作图)#bruceR#ggplot2

一次性生成4个变量所能生成的24种链式中介并作图

weixin_64183017的博客 3236

ISCE2+MintPy环境搭建实战:用Anaconda五分钟搞定InSAR处理全家桶

本文提供了一份详细的ISCE2+MintPy环境安装教程,旨在帮助InSAR处理初学者快速搭建开发环境。通过使用Anaconda创建虚拟环境并配置国内镜像,用户可在五分钟内一键安装ISCE2和MintPy全家桶,有效解决依赖冲突和版本兼容性问题,让用户能专注于数据处理本身。

2y3u4i5o6p的博客 1003

PG 数据库的备份

此外,pg_dump 和 pg_restore 命令还有许多其他选项,例如指定备份文件的格式、压缩备份文件、排除某些对象等。请注意,在恢复备份文件之前,确保你已经创建了目标数据库,并且与备份文件中的数据库具有相同的结构和权限。pg_restore 命令将读取备份文件中的内容,并将其恢复到指定的数据库中。命令来恢复备份文件。,其中包含了数据库的所有对象和数据。指定连接数据库的用户名,指定要备份的数据库名称,指定连接数据库的用户名,指定要恢复的数据库名称,指定备份文件的名称。指定备份文件的名称。

weixin_41870061的博客 3686

别再怕非观测区了!手把手教你用移相法搞定PMSM单电阻FOC的电流重构难题

本文详细解析了永磁同步电机(PMSM)单电阻FOC系统中非观测区的电流重构难题,重点介绍了移相法的工程实践。通过STM32平台的具体实现和调试指南,帮助工程师有效解决相电流检测中的采样窗口不足问题,提升系统稳定性和性能。

weixin_27252001的博客 433

pg数据库存储过程与函数

错误例子定义了两个值 IN OUT 这样运行的话,应该多加个参数占位。

WicaZ的博客 279

MBD-从一个示例看代码生成过程(rtw文件、TLC语言)

大概介绍了MBD代码生成流程,rtw文件、TLC语言

小胡同学的工程师学习之路 4214

kali2020.2安装出现的问题并附详细解决办法

kali2020.2的安装

weixin_48776804的博客 3048

PG自定义函数写法说明

PostgreSQL函数也称为PostgreSQL存储过程。 PostgreSQL函数或存储过程是存储在数据库服务器上并可以使用SQL界面调用的一组SQL和过程语句。 1、自定义函数说明 语法: CREATE [OR REPLACE] FUNCTION function_name (arguments) RETURNS return_datatype AS $variable_name$ DECLARE declaration; [...] B...

lovestmost的博客 8564

optee系统启动流程

BL2 - Trusted Boot Firmware,一般为Trusted Bootloader, 也称第一个启动镜像。BL31 - EL3 Runtime Firmware,负责双系统切换,运行在secure monitor 或ATF中。BL33 - Non-Trusted Firmware,一般为uboot、linux kernel。BL32 - Secure-EL1 Payload, 一般为TEE OS Image。BL1 - Trusted ROM,一般为BootRom。

baron-周贺贺-代码改变世界ctw 279

Backend - postgresSQL DB Procedure(数据库存储过程)

知识量决定了未来能走多远

是萝卜干呀的博客 1577

windows下使用Nginx搭建Rtmp流媒体服务器,实现视频直播功能

一、环境介绍 操作系统:win10 64位系统 Linux下搭建Nginx搭建Rtmp流媒体服务器方法请看这里:https://blog.youkuaiyun.com/xiaolong1126626497/article/details/105378894 二、流媒体服务器介绍 流媒体服务器的主要功能是以流式协议(RTP/RTSP、MMS、RTMP等)将视频文件传输到客户端,供用户在线观看;也可从视频采集、压缩软件接收实时视频流,再以流式协议直播给客户端。 nginx服务器是开源的高性能的http服务器,反向

1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

pg 事务 存储过程_你必须收藏的Greenplum常用pg_catalog监控语句

Greenplum把元数据保存在系统表中。在Greenplum的系统表里,用户可以找到关于集群状态的几乎所有信息。Greenplum资深用户小徐将在本文详细揭秘最常用的系统表信息。目录1.Greenplum 基本查询信息1.1Greenplum 常用查询1.2Greenplum 触发器,锁,类型等相关信息1.3Greenplum 故障检测相关的信息1.4Greenplum 分...

weixin_42401137的博客 2444

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

TIL 实战:用 pg_database_size() 获取 PostgreSQL 数据库磁盘占用

在 PostgreSQL 日常运维中,快速获知某个数据库到底占用了多少磁盘空间,是容量评估、清理排障和成本核算的基础操作。本文以 TIL 仓库中 [postgres/get-the-size-of-a-database.md](https://link.gitcode.com/i/3327843bf1ad13cc536bfbfe3ba86e1c) 记录的方法为主线,讲解 `pg_database_

gitblog_01091的博客 167

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

检查 PostgreSQL 集群中各数据库大小:\l+ 元命令与 pg_database_size 查询实战

在管理一个 PostgreSQL 服务器实例(集群)时,快速摸清每个数据库占用的磁盘空间是容量规划与运维排障的常见需求。本文围绕 [check-the-size-of-databases-in-a-cluster.md](https://link.gitcode.com/i/cebec1774a36840512018ee518e92d4b) 的核心内容,系统讲解两种检查集群内全部数据库大小的方法:

gitblog_00045的博客 78

数据库之postgreSQL存储过程写法示例

PostgreSQL的存储过程简单入门 [url]http://blog.youkuaiyun.com/rachel_luo/article/details/8073458[/url] 存储过程事物 [url]http://www.php100.com/manual/PostgreSQL8/tutorial-transactions.html[/url] PL/pgSQL - SQL存储过程语言 [url]h...

weixin_40594160的博客 2119

pg_partman项目:升级PostgreSQL后修复缺失存储过程的完整指南

在PostgreSQL数据库管理中,分区表是处理大规模数据的有效手段。pg_partman作为PostgreSQL生态中广受欢迎的分区管理扩展,能够简化分区表的创建和维护工作。然而,当PostgreSQL从较旧版本升级到11或更高版本时,用户可能会遇到pg_partman存储过程缺失的问题。本文将详细介绍这一问题的成因及解决方案。 ## 问题背景 PostgreSQL 11引入了一个重要变化:...

gitblog_00861的博客 1066
L . R
博客等级 码龄11年 1粉丝 0原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值