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

创建 PostgreSQL 函数案例

创建 PostgreSQL 函数案例

  • 一、前言
  • 二、准备数据
  • 三、案例
    • 1、简单使用
    • 2、返回单个字段
    • 3、返回多个字段
    • 4、传入参数
    • 5、在函数中产生变量返回
    • 6、实现分页

一、前言

最近因为项目需要创建了数据库函数,数据库是 PostgreSQL ,这里做个创建函数的记录。

二、准备数据

准备了如下数据:

在这里插入图片描述

后续创建函数都使用这些数据。

三、案例

1、简单使用

假如要将如下 sql 放到函数里:

select * from mr m order by m.create_time desc;

创建如下函数:

create or replace function get_mr_data_1()
returns setof mr as
$BODY$
		begin
				return query select * from mr m order by m.create_time desc;
		end;
$BODY$
language plpgsql;

在这里插入图片描述

使用函数查询, sql 如下:

select get_mr_data_1();

在这里插入图片描述

解释:

create or replace function get_mr_data_1()  -- 创建名为get_mr_data_1()的函数,存在时替换。
returns setof mr as   -- 返回类型,这里为mr(我的表)
$BODY$     -- 在 $BODY$ 之间编写函数体,也可以使用 $$
		begin  -- 函数的开始标志
				return query select * from mr m order by m.create_time desc;
		end;   -- 函数的结束标志
$BODY$     -- 在 $BODY$ 之间编写函数体,也可以使用 $$
language plpgsql;   -- 指定 language plpgsql 来告诉 PostgreSQL 使用 PL/pgSQL 来编译和执行函数。

2、返回单个字段

假如只返回 name 这个字段, sql 如下:

select m.name from mr m order by m.create_time desc;

创建如下函数:

create or replace function get_mr_data_2()  
returns table(name varchar) as   
$BODY$     
		begin  
				return query select m.name from mr m order by m.create_time desc;
		end;   
$BODY$     
language plpgsql;  

在这里插入图片描述

使用函数查询

select get_mr_data_2();

在这里插入图片描述

解释:

create or replace function get_mr_data_2()  -- 创建名为get_mr_data_2()的函数,存在时替换。
returns table(name varchar) as   -- 返回类型,这里为返回字段 name ,返回类型为 varchar 
$BODY$     -- 在 $BODY$ 之间编写函数体,也可以使用 $$
		begin  -- 函数的开始标志
				return query select m.name from mr m order by m.create_time desc;
		end;   -- 函数的结束标志
$BODY$     -- 在 $BODY$ 之间编写函数体,也可以使用 $$
language plpgsql;   -- 指定 language plpgsql 来告诉 PostgreSQL 使用 PL/pgSQL 来编译和执行函数。

3、返回多个字段

假如要返回 id ,name ,create_time 这个三个字段

select m.id, m.name, m.create_time from mr m order by m.create_time desc;

创建如下函数:

create or replace function get_mr_data_3()  
returns table(id varchar, name varchar, create_time timestamp) as   
$BODY$     
		begin  
				return query select m.id, m.name, m.create_time from mr m order by m.create_time desc;
		end;   
$BODY$     
language plpgsql; 

在这里插入图片描述

使用函数查询:

select get_mr_data_3();

在这里插入图片描述

解释:

create or replace function get_mr_data_3()  -- 创建名为get_mr_data_2()的函数,存在时替换。
returns table(id varchar, name varchar, create_time timestamp) as   -- 返回类型,这里为返回字段分别为 id ,name ,create_time ,返回类型分别为 varchar ,varchar ,timestamp
$BODY$     -- 在 $BODY$ 之间编写函数体,也可以使用 $$
		begin  -- 函数的开始标志
				return query select m.id, m.name, m.create_time from mr m order by m.create_time desc;
		end;   -- 函数的结束标志
$BODY$     -- 在 $BODY$ 之间编写函数体,也可以使用 $$
language plpgsql;   -- 指定 language plpgsql 来告诉 PostgreSQL 使用 PL/pgSQL 来编译和执行函数。

4、传入参数

查询 id 为 1843560690671853578 的记录

select m.id, m.name, m.create_time from mr m where m.id = '1843560690671853578'

创建如下函数:

create or replace function get_mr_data_4(select_id varchar)  
returns table(id varchar, name varchar, create_time timestamp) as   
$BODY$     
		begin  
				return query select m.id, m.name, m.create_time from mr m where m.id = select_id;
		end;   
$BODY$     
language plpgsql;

在这里插入图片描述

使用函数查询

select get_mr_data_4('1843560690671853578')

在这里插入图片描述

解释:

create or replace function get_mr_data_4(select_id varchar)  -- 创建名为get_mr_data_4()的函数,存在时替换,参数名为 select_id ,类型为 varchar ,查询参数类型和数据库字段类型保持一致。
returns table(id varchar, name varchar, create_time timestamp) as   -- 返回类型,这里为返回字段分别为 id ,name ,create_time ,返回类型分别为 varchar ,varchar ,timestamp
$BODY$     -- 在 $BODY$ 之间编写函数体,也可以使用 $$
		begin  -- 函数的开始标志
				return query select m.id, m.name, m.create_time from mr m where m.id = select_id;
		end;   -- 函数的结束标志
$BODY$     -- 在 $BODY$ 之间编写函数体,也可以使用 $$
language plpgsql;   -- 指定 language plpgsql 来告诉 PostgreSQL 使用 PL/pgSQL 来编译和执行函数。

5、在函数中产生变量返回

模糊查询 name 并返回结果数据条数,sql 如下:

select count(*) from mr m where m.name ilike CONCAT('%', 'upload', '%');

创建如下函数:

create or replace function get_mr_data_5(select_name varchar)  
returns int as   
$BODY$     
		declare 
				num int;
		begin  
				select count(*) into num from mr m where m.name ilike CONCAT('%', select_name, '%');
				return num; 
		end;   
$BODY$     
language plpgsql;

在这里插入图片描述

使用函数查询:

select get_mr_data_5('upload')

在这里插入图片描述

解释:

create or replace function get_mr_data_5(select_name varchar)  -- 创建名为get_mr_data_5()的函数,存在时替换,参数名为 select_name ,类型为 varchar ,查询参数类型和数据库字段类型保持一致。
returns int as   -- 返回类型,这里为 int ,和返回类型保持一致
$BODY$     -- 在 $BODY$ 之间编写函数体,也可以使用 $$
		declare   -- 定义变量
				num int;  -- 变量为 num ,类型为 int ,假如有多个变量,每个变量之后带上“:”即可
		begin  -- 函数的开始标志
				select count(*) into num from mr m where m.name ilike CONCAT('%', select_name, '%');  -- into 将查询结果赋值给变量 num 
				return num;  -- 返回变量 num
		end;   -- 函数的结束标志
$BODY$     -- 在 $BODY$ 之间编写函数体,也可以使用 $$
language plpgsql;   -- 指定 language plpgsql 来告诉 PostgreSQL 使用 PL/pgSQL 来编译和执行函数。

6、实现分页

使用字段 name 进行模糊查询,查询第一页,没用十条数据, sql 如下:

select m.id, m.name, m.create_time from mr m where m.name ilike CONCAT('%', 'up', '%') order by m.create_time desc offset 0 limit 10;

创建如下函数:

create or replace function get_mr_data_6(select_name varchar, page_num integer, page_size integer) 
returns table(id varchar, name varchar, create_time timestamp) as
$BODY$
		begin
				return query select m.id, m.name, m.create_time from mr m where m.name ilike CONCAT('%', select_name, '%') order by m.create_time desc offset (page_num - 1) * page_size limit page_size;
		end;
$BODY$
language plpgsql;

在这里插入图片描述

使用函数查询:

select get_mr_data_6('up', 1, 10)

在这里插入图片描述

在这里插入图片描述

可以看到实现了分页。

解释:

create or replace function get_mr_data_6(select_name varchar, page_num integer, page_size integer)  -- 创建名为get_mr_data_6()的函数,存在时替换,参数名分别为 select_name 、page_num 、page_size ,类型为 varchar 、 integer 、integer ,查询参数类型和数据库字段类型保持一致。
returns int as   -- 返回类型,这里为 int ,和返回类型保持一致
$BODY$     -- 在 $BODY$ 之间编写函数体,也可以使用 $$
		begin  -- 函数的开始标志
				return query select m.id, m.name, m.create_time from mr m where m.name ilike CONCAT('%', select_name, '%') order by m.create_time desc offset (page_num - 1) * page_size limit page_size;  -- postgresql 的 offset 1 limit 10 相当于 mysql 的 limit 1 10
		end;   -- 函数的结束标志
$BODY$     -- 在 $BODY$ 之间编写函数体,也可以使用 $$
language plpgsql;   -- 指定 language plpgsql 来告诉 PostgreSQL 使用 PL/pgSQL 来编译和执行函数。

http://www.kler.cn/a/378013.html

相关文章:

  • C++:AVL树
  • GR2——在大规模视频数据集上预训练且机器人数据上微调,随后预测动作轨迹和视频(含GR1详解)
  • 显存占用 显存测试
  • 《JVM第4课》程序计数器
  • 算法学习027 c++蛇形三角形填充 二维数组常规应用 中小学算法思维学习 比赛算法题解 信奥算法解析
  • 【Python】【数据可视化】【商务智能方法与应用】课程 作业一 飞桨AI Studio
  • 动态规划应该如何学习?
  • OpenSSL:生成 DER 格式的 RSA 密钥对
  • 多线程之间的通讯
  • 项目复盘:TapTap聚光灯Gamejam
  • 【1】Excel快速入门的核心概念
  • 视频点播系统扩展示例
  • <项目代码>YOLOv8 夜间车辆识别<目标检测>
  • CSPJ2019-1数字游戏 (Number Games)
  • tcp shutdown, fin_wait1, fin_wait2, close_wait, last_ack, 谢特!
  • Spring源码学习(三):finishBeanFactoryInitialization
  • 线程安全的单例模式(Singleton)。
  • 轮廓图【HTML+CSS+JavaScript】
  • Java日志脱敏(二)——fastjson Filter + 注解 + 工具类实现
  • 统信UOS开发环境支持php
  • 使用Vite构建现代化前端应用
  • 使用AIM对SAP PO核心指标的自动化巡检监控
  • SQL,力扣题目1285,找到连续区间的开始和结束数字【窗口函数】
  • VsCode前端常用快捷键
  • 冷钱包与热钱包的差异 | 加密货币存储的安全方案
  • 03.DDD六边形架构