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