2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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 的任何变体(而不是 FETCH NEXTFETCH FORWARD 以及正数计数),则应使用 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 标准仅定义了在嵌入式 SQL 中使用 FETCH。此处描述的 FETCH 的变体将数据返回,就像它是 SELECT 结果一样,而不是将其放入主机变量中。除了这一点之外,FETCH 与 SQL 标准完全向上兼容。

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

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

另请参阅

CLOSEDECLAREMOVE

提交更正

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