↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / SQL 命令 / 游标与预备语句

SQL COMMAND · 游标与预备语句

FETCH

使用游标从查询中检索行

retrieve rows from a query using a cursor

FETCH游标与预备语句引入 6.4(基线)现存至 20 devel6 次语法变更

动词
FETCH
对象
—
引入版本
6.4(基线)
状态
现存
语法变更次数
6
手册小节数
7

本站手册 · 18官方文档 ↗

版本轨迹

相对 PostgreSQL 17 无变化。

语法铁道图 PostgreSQL 18

沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。

FETCH direction FROM IN cursor_name
direction
NEXT PRIOR FIRST LAST ABSOLUTE count RELATIVE count count ALL FORWARD FORWARD count FORWARD ALL BACKWARD BACKWARD count BACKWARD ALL

语法概要

FETCH [ direction ] [ FROM | IN ] cursor_name
其中 direction 可以是以下之一:

NEXT
PRIOR
FIRST
LAST
ABSOLUTE count
RELATIVE count
count
ALL
FORWARD
FORWARD count
FORWARD ALL
BACKWARD
BACKWARD count
BACKWARD ALL

PostgreSQL 18 手册 · 查看完整参考页

描述

FETCH 使用先前创建的游标检索行。

游标带有一个关联位置,FETCH 会使用该位置。游标位置可以位于查询结果的第一行之前、结果中的任意一行上,或者位于结果的最后一行之后。游标创建时位于第一行之前。提取若干行后,游标会定位在最近提取的那一行上。如果 FETCH 越过了可用行的末尾,那么游标会留在最后一行之后;如果是向后提取,则会留在第一行之前。FETCH ALL 或者 FETCH BACKWARD ALL 总是会让游标位于最后一行之后或第一行之前。

NEXT、PRIOR、FIRST、LAST、ABSOLUTE、RELATIVE 这些形式会在适当地移动游标后提取一行。如果不存在这样的行,则返回空结果,并根据情况将游标定位在第一行之前或最后一行之后。

使用 FORWARD 和 BACKWARD 的形式会在向前或向后的方向上提取指定数量的行,并将游标定位在最后返回的那一行上(如果 count 超过可用行数,则定位在所有行之后或之前)。

RELATIVE 0、FORWARD 0 以及 BACKWARD 0 都会请求提取当前行而不移动游标,也就是重新提取最近一次提取的行。除非游标位于第一行之前或最后一行之后,否则该操作都会成功;在这两种情况下,不会返回任何行。

注意

本页面描述的是 SQL 命令层面的游标用法。如果想要在 PL/pgSQL 函数中使用游标,规则会有所不同 — 见第 41.7.3 节。

参数

direction

direction 定义提取方向以及要提取的行数。它可以是下列之一:

NEXT

提取下一行。如果省略 direction,这将是默认值。

PRIOR

提取前一行。

FIRST

提取查询的第一行(与 ABSOLUTE 1 相同)。

LAST

提取查询的最后一行(与 ABSOLUTE -1 相同)。

ABSOLUTE count

提取查询的第 count 行;如果 count 为负,则提取从末尾算起的第 abs(count) 行。如果 count 超出范围,则定位在第一行之前或最后一行之后。特别地,ABSOLUTE 0 会定位在第一行之前。

RELATIVE count

提取后面的第 count 行;如果 count 为负,则提取前面的第 abs(count) 行。RELATIVE 0 会重新提取当前行(如果有)。

count

提取接下来的 count 行(与 FORWARD count 相同)。

ALL

提取所有剩余行(与 FORWARD ALL 相同)。

FORWARD

提取下一行(与 NEXT 相同)。

FORWARD count

提取接下来的 count 行。FORWARD 0 会重新提取当前行。

FORWARD ALL

提取所有剩余行。

BACKWARD

提取前一行(与 PRIOR 相同)。

BACKWARD count

提取前面的 count 行(反向扫描)。BACKWARD 0 会重新提取当前行。

BACKWARD ALL

提取之前的所有行(反向扫描)。

count

count 是一个可带符号的整数常量,用于确定要提取的位置或行数。对于 FORWARD 和 BACKWARD 这两种情况,指定负的 count 等效于颠倒 FORWARD 和 BACKWARD 的方向。

cursor_name

一个已打开游标的名称。

输出

成功完成时,FETCH 命令会返回如下形式的命令标签:

FETCH count

其中 count 是提取到的行数(可能为零)。注意,在 psql 中,命令标签实际上不会显示,因为 psql 会改为显示提取到的行。

注解

如果打算使用除 FETCH NEXT 或带正数计数的 FETCH FORWARD 之外的任何 FETCH 变体,则应当在声明游标时使用 SCROLL 选项。对于简单查询,PostgreSQL 允许从未使用 SCROLL 声明的游标向后提取,但最好不要依赖这种行为。如果游标声明为 NO SCROLL,则不允许向后提取。

ABSOLUTE 提取并不比通过相对移动到达目标行更快:无论如何,底层实现都必须遍历所有中间行。负值的绝对提取甚至更糟:必须先把查询读到末尾以找到最后一行,然后再从那里反向遍历。不过,回卷到查询起始处(如 FETCH ABSOLUTE 0)是很快的。

DECLARE 用于定义游标。使用 MOVE 可以在不检索数据的情况下改变游标位置。

示例

下面的示例展示了如何使用游标遍历一个表:

BEGIN WORK;

-- 建立一个游标:
DECLARE liahona SCROLL CURSOR FOR SELECT * FROM films;

-- 从游标 liahona 中提取前 5 行:
FETCH FORWARD 5 FROM liahona;

 code  |          title          | did | date_prod  |   kind   |  len
-------+-------------------------+-----+------------+----------+-------
 BL101 | The Third Man           | 101 | 1949-12-23 | Drama    | 01:44
 BL102 | The African Queen       | 101 | 1951-08-11 | Romantic | 01:43
 JL201 | Une Femme est une Femme | 102 | 1961-03-12 | Romantic | 01:25
 P_301 | Vertigo                 | 103 | 1958-11-14 | Action   | 02:08
 P_302 | Becket                  | 103 | 1964-02-03 | Drama    | 02:28

-- 提取前一行:
FETCH PRIOR FROM liahona;

 code  |  title  | did | date_prod  |  kind  |  len
-------+---------+-----+------------+--------+-------
 P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08

-- 关闭游标并结束事务:
CLOSE liahona;
COMMIT WORK;

兼容性

SQL 标准只为嵌入式 SQL 定义了 FETCH。这里描述的 FETCH 变体会像 SELECT 结果那样返回数据,而不是把数据放入主变量中。除此之外,FETCH 与 SQL 标准完全向上兼容。

涉及 FORWARD 和 BACKWARD 的 FETCH 形式,以及形式 FETCH count 和 FETCH ALL(其中隐含了 FORWARD)都是 PostgreSQL 扩展。

SQL 标准只允许在游标名之前使用 FROM;允许使用 IN,或者将两者都完全省略,都是扩展。

另见

语法演化

相邻大版本之间的差异,新的在前。版本号链接到对应快照。

  1. PostgreSQL 17← 16正文更新

    正文更新
  2. PostgreSQL 14← 13正文更新

    正文更新
  3. PostgreSQL 12← 11正文更新

    正文更新
  4. PostgreSQL 11← 10正文更新

    正文更新
  5. PostgreSQL 10← 9.6语法变化

    + FETCH [ direction ] [ FROM | IN ] cursor_name− FETCH [ direction [ FROM | IN ] ] cursor_name正文更新
  6. PostgreSQL 9.6← 9.5正文更新

    正文更新
  7. PostgreSQL 9.3← 9.2正文更新

    正文更新
  8. PostgreSQL 9.0← 8.4语法变化

    + FETCH [ direction [ FROM | IN ] ] cursor_name− FETCH [ direction { FROM | IN } ] cursorname− where direction can be empty or one of:正文更新
  9. PostgreSQL 8.4← 8.3正文更新

    正文更新
  10. PostgreSQL 8.3← 8.2正文更新

    正文更新
  11. PostgreSQL 8.0← 7.4正文更新

    正文更新
  12. PostgreSQL 7.4← 7.3语法变化

    + FETCH [ direction { FROM | IN } ] cursorname+ where direction can be empty or one of:+ NEXT+ PRIOR+ FIRST+ LAST+ ABSOLUTE count+ RELATIVE count+ count+ ALL+ FORWARD count+ FORWARD ALL+ BACKWARD count+ BACKWARD ALL− FETCH [ direction ] [ count ] { IN | FROM } cursor− FETCH [ FORWARD | BACKWARD | RELATIVE ] [ # | ALL | NEXT | PRIOR ]− { IN | FROM } cursor− FETCH RELATIVE 0 FROM cursor.正文更新
  13. PostgreSQL 7.2← 7.1正文更新

    正文更新
  14. PostgreSQL 7.1← 7.0语法变化

    sql-fetch.htm → sql-fetch.html

    − FETCH ABSOLUTE #− FROM cursor− INTO :variable [, ...]正文更新
  15. PostgreSQL 7.0← 6.5语法变化

    + FETCH [ direction ] [ count ] { IN | FROM } cursor+ FETCH [ FORWARD | BACKWARD | RELATIVE ] [ # | ALL | NEXT | PRIOR ] { IN | FROM } cursor+ FETCH ABSOLUTE #+ FROM cursor+ INTO :variable [, ...]− FETCH [ selector ] [ count ] { IN | FROM } cursor− FETCH [ RELATIVE ] [ { [ # | ALL | NEXT | PRIOR ] } ] FROM ] cursor正文更新
  16. PostgreSQL 6.5← 6.4语法变化

    + FETCH RELATIVE 0 FROM cursor正文更新

同组命令

命令动词对象版本变动最近变更
CURSORS & PREPARED STATEMENTS游标与预备语句7 条↑
CLOSECLOSE— 8.32 次
关闭一个游标现存
DEALLOCATEDEALLOCATE— 8.32 次
释放一个预备语句现存
DECLAREDECLARE— 144 次
定义一个游标现存
EXECUTEEXECUTE— 8.21 次
执行一个预备语句现存
FETCHFETCH— 106 次
使用游标从查询中检索行现存
MOVEMOVE— 106 次
定位游标现存
PREPAREPREPARE— 9.03 次
预备一个语句以供执行现存