PL/pgSQL 入门教程(四):使用游标(cursor)

PL/pgSQL 入门教程(四):使用游标(cursor)你可以把游标理解为 PostgreSQL 中的 数据指针 它不像普通 语句那样一次性把所有查询结果加载到内存 而是像翻书一样 每次只读取一行或几行数据 还能自由控制读取的方向 向前 向后 和位置 避免内存溢出 查询几十万 几百万行数据时 一次性加载会占满内存 游标逐行读取可规避这个问题 逐行处理数据 需要对每行数据做个性化处理 比如调用函数 复杂计算 条件更新 时

大家好,我是讯享网,很高兴认识大家。这里提供最前沿的Ai技术和互联网信息。



你可以把游标理解为 PostgreSQL 中的“数据指针”——它不像普通 语句那样一次性把所有查询结果加载到内存,而是像翻书一样,每次只读取一行或几行数据,还能自由控制读取的方向(向前、向后)和位置。

  • 避免内存溢出:查询几十万、几百万行数据时,一次性加载会占满内存,游标逐行读取可规避这个问题;
  • 逐行处理数据:需要对每行数据做个性化处理(比如调用函数、复杂计算、条件更新)时,游标能精准操作每一行;
  • 函数返回大结果集:PL/pgSQL 函数无法直接返回超大结果集,游标可以作为“桥梁”,让调用方按需读取数据;
  • 精准更新/删除指定行:通过游标定位到某一行后,可直接更新或删除这一行。

小提醒:PL/pgSQL 的 循环会自动用游标,日常简单遍历不用手动写游标,但复杂场景(比如动态查询、返回结果集)必须手动操作。

所有游标都基于 类型的变量,这是 PostgreSQL 专门为游标设计的特殊类型,你可以把它理解为“游标身份证”。

类型 特点 适用场景 未绑定游标 声明时不指定查询,打开时再定义 动态查询(比如表名、条件可变) 绑定游标 声明时就绑定固定查询(可带参数) 固定逻辑的重复查询

声明有两种方式,对应两种游标类型:

方式1:声明未绑定游标(最灵活)

直接声明 类型变量,后续可绑定任意查询:

 
  

方式2:声明绑定游标(固定查询)

声明时直接绑定查询,支持带参数,语法:

 
  
  • :允许游标向后读取(比如读上一行、最后一行);
  • :禁止向后读取,仅能向前;
  • 参数:查询中可使用的变量,打开时传值。

示例:

 
  

游标必须“打开”才能用,相当于给游标“加载查询逻辑”。PL/pgSQL 有3种打开方式,对应不同场景:

方式1:打开未绑定游标(固定查询)

语法:

 
  

示例:

 
  

方式2:打开未绑定游标(动态查询)

 
  

示例:

 
  

方式3:打开绑定游标

 
  

示例:

 
  

打开游标后,可通过 、、 操作数据:

1. FETCH:读取游标数据

 
  
  • 方向可选:(下一行,默认)、(上一行)、(第一行)、(最后一行)、(相对当前位置移动n行);
  • 变量:可以是行变量、记录变量,或多个普通变量(与查询字段一一对应)。

示例:

 
  

2. MOVE:移动游标位置(不读取数据)

只想调整游标位置,不想读取数据时用 ,语法和 几乎一样:

 
  

示例:

 
  

3. UPDATE/DELETE:修改游标当前行

 
  

示例:

 
  
 
  

示例:

 
  

如果只是简单遍历游标结果,不用手动写 //,PL/pgSQL 的 循环会自动处理,这是日常最常用的方式。

 
  
  • 记录变量:自动创建 类型变量,无需提前声明;
  • 游标会自动打开,循环结束后自动关闭。
 
  

PL/pgSQL 函数无法直接返回几十万行数据,但可以返回游标,让调用方按需读取。注意:游标依赖事务,必须在事务内调用!

 
  
 
  

注意:以下案例只是举例说明游标的用法,请勿直接用于生产环境!!!

 
  

需求:更新100万行用户数据,一次性更新会锁表,用游标分批更新(每次更1000行)。

 
  

小讯
上一篇 2026-04-04 23:23
下一篇 2026-04-04 23:21

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/222649.html