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

news/2024/7/9 22:04:51 标签: postgresql, 数据库

场景

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 $$
DECLARE
 rec_user RECORD;
 cur_user CURSOR(user_name VARCHAR) FOR
 SELECT id, name
 FROM b_user
 WHERE 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 cursor
 CLOSE 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 指定函数实现的语言。

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

CREATE
 OR REPLACE FUNCTION get_user_count (user_name VARCHAR ) RETURNS INTEGER AS $$ DECLARE
 ln_count INTEGER;
BEGIN
 SELECT COUNT
  (*) INTO ln_count
 FROM
  b_user
 WHERE
  name = user_name;
 RETURN ln_count;
 
END; $$ LANGUAGE plpgsql;

函数调用方式

SELECT name,get_user_count(name)
FROM b_user ;

调用结果

3、创建存储过程

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

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

CREATE
 OR REPLACE PROCEDURE update_user (user_id in integer,user_name IN VARCHAR) AS $$ BEGIN
  UPDATE b_user
  SET name = user_name
 WHERE
  id = user_id;
 
END; $$ LANGUAGE plpgsql;

存储过程调用方法:

call update_user(1,'badao');


http://www.niftyadmin.cn/n/5276546.html

相关文章

基于Antd4 和React-hooks的项目开发

基于Antd4 和React-hooks的项目开发 https://github.com/dL-hx/react-cnode 项目依赖使用 react 16.13react-redux 7.xreact-router-dom 5.xredux 4.xantd 4axiosmoment 2.24 (日期格式化)qs 项目视图说明 首页主题详情用户列表用户详情关于 配置按需加载 https://3x.an…

Java版直播商城免 费 搭 建:电商、小程序、三级分销及免 费 搭 建,平台规划与营销策略全掌握

随着互联网的快速发展,越来越多的企业开始注重数字化转型,以提升自身的竞争力和运营效率。在这个背景下,鸿鹄云商SAAS云产品应运而生,为企业提供了一种简单、高效、安全的数字化解决方案。 鸿鹄云商SAAS云产品是一种基于云计算的软…

【CSS @property】CSS自定义属性说明与demo

CSS property property - CSS: Cascading Style Sheets | MDN At 规则 - CSS:层叠样式表 | MDN Custom properties (–*): CSS variables - CSS: Cascading Style Sheets | MDN CSS Houdini - Developer guides | MDN 📚 什么是property? property CSS…

ES 错误码

2xx状态码(如200)表示请求成功处理,并且不需要重试。 400状态码表示客户端发送了无效的请求,例如请求的语法有误或缺少必需的参数。在这种情况下,重试相同的请求很可能会导致相同的错误。因此,应该先检查并…

C#线程Thread的使用

引言 在C#编程语言中,线程是一种并发执行的机制,可以实现多个任务同时执行,提高程序的效率和响应能力。C#提供了Thread类来处理线程相关的操作。本文将详细介绍C#中Thread类的使用方法和注意事项。 目录 引言线程的基本概念线程(…

LeetCode day28

LeetCode day28 由于一点小意外,今天就来搞搞滑动窗口(ง •_•)ง 1423. 可获得的最大点数 几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动,你可以从行的开头或者末尾拿一张卡牌,…

麒麟V10 ARM 离线生成RabbitMQ docker镜像并上传Harbor私有仓库

第一步在外网主机执行: docker pull arm64v8/rabbitmq:3.8.9-management 将下载的镜像打包给离线主机集群使用 在指定目录下执行打包命令: 执行: docker save -o rabbitmq_arm3.8.9.tar arm64v8/rabbitmq:3.8.9-management 如果懒得打包…

macOS下载

macOS 下载 历史版本下载地址: https://support.apple.com/zh-cn/HT211683 例: macOS 11 Big sur: https://apps.apple.com/cn/app/macos-big-sur/id1526878132?mt12