2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

FETCH

FETCH — 使用游标从查询中检索行

概要

FETCH [ direction ] [ FROM | IN ] cursor_name

where direction can be one of:

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

描述

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

游标有一个关联的位置,FETCH 使用该位置。游标位置可以是在查询结果的第一行之前、结果的任何特定行上,或结果的最后一行之后。创建时,游标定位在第一行之前。在获取一些行之后,游标定位在最近检索的行上。如果 FETCH 超出可用行的末尾,则游标将停留在最后一行之后,或者在向后获取时停留在第一行之前。FETCH ALLFETCH BACKWARD ALL 将始终将游标定位在最后一行之后或第一行之前。

形式 NEXTPRIORFIRSTLASTABSOLUTERELATIVE 在适当地移动游标后获取单行。如果不存在这样的行,则返回一个空结果,并且游标会根据情况定位在第一行之前或最后一行之后。

使用 FORWARDBACKWARD 的形式在向前或向后方向上检索指示数量的行,将游标定位在最后返回的行上(如果 count 超过可用行数,则定位在所有行之后/之前)。

RELATIVE 0FORWARD 0BACKWARD 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 是一个可能的带符号整数常量,用于确定要获取的位置或行数。对于 FORWARDBACKWARD 的情况,指定负数 count 等同于改变 FORWARDBACKWARD 的方向。

cursor_name

一个已打开游标的名称。

输出

成功完成时,FETCH 命令返回一个形式为

FETCH count

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

注释

如果打算使用 FETCH NEXTFETCH FORWARD 且计数值为正数以外的 FETCH 变体,则游标应使用 SCROLL 选项声明。对于简单的查询,PostgreSQL 将允许从未声明 SCROLL 的游标中向后获取,但最好不要依赖此行为。如果游标声明为 NO SCROLL,则不允许向后获取。

ABSOLUTE 获取与使用相对移动导航到所需行相比,并没有更快:底层实现仍然必须遍历所有中间行。负数绝对获取效果更差:必须读取查询到末尾以查找最后一行,然后从那里向后遍历。然而,重置到查询的开头(如 FETCH ABSOLUTE 0)是快速的。

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

示例

以下示例使用游标遍历表

BEGIN WORK;

-- Set up a cursor:
DECLARE liahona SCROLL CURSOR FOR SELECT * FROM films;

-- Fetch the first 5 rows in the cursor liahona:
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 the previous row:
FETCH PRIOR FROM liahona;

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

-- Close the cursor and end the transaction:
CLOSE liahona;
COMMIT WORK;

兼容性

SQL 标准定义 FETCH 仅用于嵌入式 SQL。此处描述的 FETCH 变体返回数据,就好像它是 SELECT 结果一样,而不是将其放入宿主变量。除此以外,FETCH 与 SQL 标准完全向上兼容。

涉及 FORWARDBACKWARDFETCH 形式,以及 FETCH countFETCH ALL 形式(在这些形式中,FORWARD 是隐式的),是 PostgreSQL 的扩展。

SQL 标准只允许在游标名称前使用 FROM;使用 IN 的选项,或完全省略它们,是扩展。

另请参阅

CLOSE, DECLARE, MOVE

提交更正

如果您在文档中发现任何不正确、与您使用特定功能时的经验不符或需要进一步澄清的内容,请使用 此表单 来报告文档问题。