支持的版本: 当前 (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 的任何变体(除了 FETCH NEXT 或带正计数的 FETCH 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

提交更正

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