首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL vs PostgreSQL 存储过程(变量 + 循环篇)——双修教学!

MySQL vs PostgreSQL 存储过程(变量 + 循环篇)——双修教学!

作者头像
IT咸鱼
发布2025-06-23 13:04:44
发布2025-06-23 13:04:44
18900
代码可运行
举报
运行总次数:0
代码可运行

每天分享技术栈,开发工具等

一、为什么要学变量+循环?

到目前为止,我们只是实现了“查询一个人”这种简单功能。但实际业务中你经常会遇到:

  • 批量插入/更新/删除
  • 逐行遍历一个表里的每一条记录
  • 动态拼 SQL、循环执行任务

这些就离不开存储过程中的:

变量/ 循环(如 WHILEFOR


二、本篇目标

我们来做一个实际点的例子:

“遍历 users 表,把年龄小于 30 的人都打印出来,并且给他们发个‘系统欢迎消息’。”

模拟这个过程,咱们一步步来。


三、MySQL 版本(用 WHILE

1. 表结构准备(如果没建)

代码语言:javascript
代码运行次数:0
运行
复制

CREATEDATABASEIFNOTEXISTS test_sp;
USE test_sp;

CREATETABLEIFNOTEXISTS users (
    id INTAUTO_INCREMENTPRIMARYKEY,
    username VARCHAR(50),
    age INT
);

INSERTINTO users (username, age)VALUES
('Alice',25),
('Bob',30),
('Charlie',22),
('Daisy',28),
('Edward',40);

2. 创建过程(循环+变量)

代码语言:javascript
代码运行次数:0
运行
复制

DELIMITER $$

CREATEPROCEDURE loop_young_users()
BEGIN
DECLARE finished INTDEFAULT0;
DECLARE uid INT;
DECLARE uname VARCHAR(50);
DECLARE uage INT;

-- 游标,用来遍历所有年龄小于30的用户
DECLARE user_cursor CURSORFOR
SELECT id, username, age FROM users WHERE age <30;

-- 捕获结束
DECLARE CONTINUEHANDLERFORNOT FOUND SET finished =1;

-- 打开游标
OPEN user_cursor;

-- 开始循环
    read_loop: LOOP
FETCH user_cursor INTO uid, uname, uage;

IF finished =1THEN
LEAVE read_loop;
ENDIF;

-- 模拟“发送消息”
SELECT CONCAT('已向 ', uname,'(年龄:', uage,')发送系统欢迎消息')AS info;
ENDLOOP;

-- 关闭游标
CLOSE user_cursor;
END $$

DELIMITER;

3. 调用存储过程

代码语言:javascript
代码运行次数:0
运行
复制

CALL loop_young_users();

输出类似:

代码语言:javascript
代码运行次数:0
运行
复制

+---------------------------------------------+
| info                                        |
+---------------------------------------------+
| 已向 Alice(年龄:25)发送系统欢迎消息       |
| 已向 Charlie(年龄:22)发送系统欢迎消息     |
| 已向 Daisy(年龄:28)发送系统欢迎消息       |
+---------------------------------------------+

四、PostgreSQL 版本(用 FOR循环更简洁)

1. 同样的表结构

假设你在 psqlpgAdmin中操作:

代码语言:javascript
代码运行次数:0
运行
复制

CREATETABLEIFNOTEXISTS users (
    id SERIAL PRIMARYKEY,
    username VARCHAR(50),
    age INT
);

INSERTINTO users (username, age)VALUES
('Alice',25),
('Bob',30),
('Charlie',22),
('Daisy',28),
('Edward',40);

2. 创建过程(PL/pgSQL 语法)

代码语言:javascript
代码运行次数:0
运行
复制

CREATE OR REPLACE PROCEDURE loop_young_users()
LANGUAGE plpgsql
AS $$
DECLARE
    rec RECORD;
BEGIN
FOR rec IN SELECT id, username, age FROM users WHERE age <30LOOP
        RAISE NOTICE '已向 %(年龄:%)发送系统欢迎消息', rec.username, rec.age;
END LOOP;
END;
$$;

3. 执行存储过程

代码语言:javascript
代码运行次数:0
运行
复制

CALL loop_young_users();

输出(PostgreSQL 在终端或日志中显示 NOTICE):

代码语言:javascript
代码运行次数:0
运行
复制

NOTICE:  已向 Alice(年龄:25)发送系统欢迎消息
NOTICE:  已向 Charlie(年龄:22)发送系统欢迎消息
NOTICE:  已向 Daisy(年龄:28)发送系统欢迎消息

五、MySQL vs PostgreSQL 语法对比表

功能

MySQL 写法

PostgreSQL 写法

过程创建

CREATE PROCEDURE

CREATE PROCEDURE ... LANGUAGE plpgsql

循环

LOOP + FETCH + 游标

FOR record IN SELECT(更简单)

输出信息

SELECT '...'

RAISE NOTICE

游标

显式声明 + 打开/关闭

可以不用游标,直接用 FOR

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT咸鱼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、为什么要学变量+循环?
  • 二、本篇目标
  • 三、MySQL 版本(用 WHILE)
    • 1. 表结构准备(如果没建)
    • 2. 创建过程(循环+变量)
    • 3. 调用存储过程
  • 四、PostgreSQL 版本(用 FOR循环更简洁)
    • 1. 同样的表结构
    • 2. 创建过程(PL/pgSQL 语法)
    • 3. 执行存储过程
  • 五、MySQL vs PostgreSQL 语法对比表
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档