Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

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 函数中使用游标,则规则不同 — 请参见 第 43.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 相同)。

全部

获取所有剩余行(与 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 标准定义 FETCH 仅用于嵌入式 SQL。此处描述的 FETCH 变体将数据返回为 SELECT 结果,而不是将其放入主机变量中。除了这一点之外,FETCH 与 SQL 标准完全向上兼容。

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

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

另请参阅

CLOSEDECLAREMOVE