当前位置: 首页 > news >正文

Postgresql中PL/pgSQL的游标、自定义函数、存储过程的使用

场景

Postgresql中PL/pgSQL代码块的语法与使用-声明与赋值、IF语句、CASE语句、循环语句:

Postgresql中PL/pgSQL代码块的语法与使用-声明与赋值、IF语句、CASE语句、循环语句-CSDN博客

上面讲了基本语法,下面记录游标、自定义函数、存储过程的使用。

注:

博客:
霸道流氓气质_C#,架构之路,SpringBoot-CSDN博客

实现

1、PL/pgSQL游标

PL/pgSQL 游标允许我们封装一个查询,然后每次处理结果集中的一条记录。游标可以将大结果集拆分成许多小的记录,

避免内存溢出;另外,我们可以定义一个返回游标引用的函数,然后调用程序可以基于这个引用处理返回的结果集。

使用游标的步骤:

1. 声明游标变量;

2. 打开游标;

3. 从游标中获取结果;

4. 判断是否存在更多结果。如果存在,执行第 3 步;否则,执行第 5 步;

5. 关闭游标。

示例代码:

DO $$
DECLARErec_user RECORD;cur_user CURSOR(user_name VARCHAR) FORSELECT id, nameFROM b_userWHERE name = user_name;
BEGIN-- 打开游标OPEN cur_user('222');LOOP-- 获取游标中的记录FETCH cur_user INTO rec_user;-- 没有找到更多数据时退出循环EXIT WHEN NOT FOUND;RAISE NOTICE '%,% ' , rec_user.id, rec_user.name;END LOOP;-- Close the cursorCLOSE cur_user;
END $$;

示例代码运行结果

首先,声明了一个游标 cur_user,并且绑定了一个查询语句,通过一个参数user_name 获取指定姓名的用户;

然后使用 OPEN 打开游标;接着在循环中使用 FETCH 语句获取游标中的记录,如果没有找到更多数据退出循环语句;

变量 rec_user 用于存储游标中的记录;最后使用 CLOSE语句关闭游标,释放资源。

2、创建自定义PL/pgSQL函数

要创建一个自定义的 PL/pgSQL 函数,可以使用 CREATE FUNCTION 语句。

CREATE 表示创建函数,OR REPLACE 表示替换函数定义;

name 是函数名;括号内是参数,多个参数使用逗号分隔;argmode 可以是 IN(输入)、OUT(输出)、INOUT(输入输出)

或者 VARIADIC(数量可变),默认为 IN;argname 是参数名称;argtype 是参数的类型;default_expr是参数的默认值;

rettype 是返回数据的类型;AS 后面是函数的定义,和上文中的匿名块相同;最后,LANGUAGE 指定函数实现的语言。

创建一个示例函数,用于返回指定姓名的用户数量

CREATEOR REPLACE FUNCTION get_user_count (user_name VARCHAR ) RETURNS INTEGER AS $$ DECLAREln_count INTEGER;
BEGINSELECT COUNT(*) INTO ln_countFROMb_userWHEREname = user_name;RETURN ln_count;END; $$ LANGUAGE plpgsql;

函数调用方式

SELECT name,get_user_count(name)
FROM b_user ;

调用结果

3、创建存储过程

存储过程,使用 CREATE PROCEDURE 语句创建

存储过程的定义和函数主要的区别在于没有返回值,其他内容都类似。以下示例创建了一个存储过程用于修改用户的信息

CREATEOR REPLACE PROCEDURE update_user (user_id in integer,user_name IN VARCHAR) AS $$ BEGINUPDATE b_userSET name = user_nameWHEREid = user_id;END; $$ LANGUAGE plpgsql;

存储过程调用方法:

call update_user(1,'badao');

相关文章:

  • 【UML】第8篇 用例图(3/3)
  • opencv 传统图像识别检测
  • Java 中单例模式的常见实现方式
  • 计算机网络 第五章(运输层)【下】
  • js 字符串功能转换解析
  • ubuntu v2ray
  • JDBC常见的几种连接池使用(C3PO、Druid、HikariCP 、DBCP)
  • 代码随想录第三十六天(一刷C语言)|背包问题理论基础分割等和子集
  • 【稳定检索|投稿优惠】2024年区域经济与经济转型国际学术会议(IACREET 2024)
  • 2023年度佳作:AIGC、AGI、GhatGPT 与人工智能大模型的创新与前景展望
  • Elasticsearch的批量bulk 提交 写入的方式会有顺序问题吗?
  • 设计模式(三)-结构型模式(3)-装饰模式
  • 2023.12.20力扣每日一题
  • 苏宁易购商品详情API:电商实时数据
  • Linux开发工具——vim篇
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • ES6核心特性
  • express + mock 让前后台并行开发
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • js面向对象
  • js写一个简单的选项卡
  • vue 个人积累(使用工具,组件)
  • 编写符合Python风格的对象
  • 从0实现一个tiny react(三)生命周期
  • 复习Javascript专题(四):js中的深浅拷贝
  • 构建工具 - 收藏集 - 掘金
  • 基于游标的分页接口实现
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 设计模式 开闭原则
  • 学习笔记TF060:图像语音结合,看图说话
  • 用Canvas画一棵二叉树
  • 主流的CSS水平和垂直居中技术大全
  • scrapy中间件源码分析及常用中间件大全
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • (poj1.2.1)1970(筛选法模拟)
  • (安卓)跳转应用市场APP详情页的方式
  • (超详细)语音信号处理之特征提取
  • (九十四)函数和二维数组
  • (理论篇)httpmoudle和httphandler一览
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • .naturalWidth 和naturalHeight属性,
  • .net 7 上传文件踩坑
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET 事件模型教程(二)
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • /boot 内存空间不够
  • /etc/sudoers (root权限管理)
  • @Transaction注解失效的几种场景(附有示例代码)
  • [BZOJ 1040] 骑士
  • [CSS] 点击事件触发的动画
  • [ffmpeg] x264 配置参数解析
  • [HXPCTF 2021]includer‘s revenge
  • [Kubernetes]2. k8s集群中部署基于nodejs golang的项目以及Pod、Deployment详解
  • [Linux]进程间通信(进程间通信介绍 | 匿名管道 | 命名管道)