Postgresql 中文操作指南

FETCH

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

Synopsis

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

Description

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

游标具有相关联的位置,该位置由 FETCH 使用。游标位置可以在查询结果的第一行之前、结果的任何特定行上或结果的最后一行之后。创建时,游标位于第一行之前。在提取一些行后,游标会定位到最近检索到的行上。如果 FETCH 运行到可用行的末尾,则游标将保持在最后一行之后,或者如果向后提取,则位于第一行之前。 FETCH ALLFETCH BACKWARD ALL 始终会将游标放在最后一行之后或第一行之前。

NEXTPRIORFIRSTLASTABSOLUTERELATIVE 等形式会在相应移动游标后提取一行。如果没有这样的行,则返回一个空结果,并且游标将保持在第一行之前或最后一行之后(视情况而定)。

在向前或向后移动过程中,使用 FORWARDBACKWARD 的形式可以检索指定数量的行,使游标保持在最后返回的行上(如果 count 超过可用行的数量,则保持游标在所有行之后/之前)。

RELATIVE 0FORWARD 0BACKWARD 0 都要求获取当前行而不移动游标,也就是说,重新获取最近获取的行。这会成功,除非游标位于第一行前或最后一行后;在该情况下,不会返回任何行。

Note

本页介绍了 SQL 命令级别中游标的使用方法。如果尝试在一个 PL/pgSQL 函数内使用游标,则规则不同——参见 Section 43.7.3

Parameters

  • direction

    • direction 定义了获取方向以及要获取的行数。它可以是以下选项之一:

  • count

    • count 是一个可能带符号的整数常量,它决定了要获取的行数或位置。对于 FORWARDBACKWARD 情况,指定一个负的 count 等效于更改 FORWARDBACKWARD 的含义。

  • cursor_name

    • An open cursor’s name.

  • NEXT

    • 获取下一行。如果 direction 被省略,这是默认值。

  • PRIOR

    • Fetch the prior row.

  • FIRST

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

  • LAST

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

  • ABSOLUTE _count_

    • 获取查询的第 count 行,或 abs(_count ) 'th row from the end if _count 为负数。如果 count 超出范围,则在第一行前或最后一行后定位;特别是, ABSOLUTE 0 定位于第一行前。

  • RELATIVE _count_

    • 获取第 count 个后续行,或 abs(_count ) 'th prior row if _count 为负数。 RELATIVE 0 重新获取当前行(如有)。

  • count

    • 获取接下来的 count 行(与 FORWARD _count_ 相同)。

  • ALL

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

  • FORWARD

    • 获取下一行(与 NEXT 相同)。

  • FORWARD _count_

    • 获取接下来的 count 行。 FORWARD 0 重新获取当前行。

  • FORWARD ALL

    • Fetch all remaining rows.

  • BACKWARD

    • 获取前一行(与 PRIOR 相同)。

  • BACKWARD _count_

    • 获取前 count 行(向后扫描)。 BACKWARD 0 重新获取当前行。

  • BACKWARD ALL

    • 获取所有前行(向后扫描)。

Outputs

在成功完成时,一个 FETCH 命令会返回类似于以下形式的命令标记

FETCH count

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

Notes

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

ABSOLUTE 抓取的效率并不比通过相对移动方式来导航到所需行更高:底层实现必须遍历所有介于其中的行。负绝对抓取更糟糕:必须读取查询直到最后一行,然后从那里向后遍历。但是,倒带回查询的开始(对于 FETCH ABSOLUTE 0 而言)是快速的。

DECLARE 用于定义游标。使用 MOVE 来更改游标位置,而不检索数据。

Examples

下面的示例使用游标遍历表:

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;

Compatibility

SQL 标准仅将 FETCH 定义用于嵌入式 SQL 中。此处描述的 FETCH 的变体会将数据返回,就像它是 SELECT 结果,而不是将其置于主机变量中。除了这点以外, FETCH 完全向上兼容 SQL 标准。

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

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

See Also

CLOSEDECLAREMOVE