选择 打开 改范围 完整检索页
受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本的对应页面,或其他在上面列出的活跃大版本。

FETCH

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

Synopsis

FETCH [ direction ] [ FROM | IN ] cursor_name

其中 direction 可以是以下之一:

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

描述

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

游标带有一个关联位置,FETCH会使用该位置。 游标位置可以位于查询结果的第一行之前、结果中的任意一行上,或者 位于结果的最后一行之后。游标创建时位于第一行之前。提取若干行后, 游标会定位在最近提取的那一行上。如果FETCH 越过了可用行的末尾,那么游标会留在最后一行之后;如果是向后提取, 则会留在第一行之前。FETCH ALL或者 FETCH BACKWARD ALL总是会让游标位于最后一行之后 或第一行之前。

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

使用FORWARDBACKWARD的形式会在 向前或向后的方向上提取指定数量的行,并将游标定位在最后返回的那一行 上(如果count超过可用 行数,则定位在所有行之后或之前)。

RELATIVE 0FORWARD 0以及 BACKWARD 0都会请求提取当前行而不移动游标,也就是 重新提取最近一次提取的行。除非游标位于第一行之前或最后一行之后, 否则该操作都会成功;在这两种情况下,不会返回任何行。

Note

本页面描述的是 SQL 命令层面上的游标用法。如果想要在 PL/pgSQL函数中使用游标,规则会有所不同 — 请见Section 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相同)。

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 NEXT或带正数计数的 FETCH FORWARD之外的任何FETCH 变体,则应当在声明游标时使用SCROLL选项。对于简单查询, PostgreSQL允许从未使用SCROLL 声明的游标向后提取,但最好不要依赖这种行为。如果游标声明为 NO SCROLL,则不允许向后提取。

ABSOLUTE提取并不比通过相对移动到达目标行更快: 无论如何,底层实现都必须遍历所有中间行。负值的绝对提取甚至更糟: 必须先把查询读到末尾以找到最后一行,然后再从那里反向遍历。不过, 回卷到查询起始处(如FETCH ABSOLUTE 0)是很快的。

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

示例

下面的示例展示了如何使用游标遍历一个表:

BEGIN WORK;

-- 建立一个游标:
DECLARE liahona SCROLL CURSOR FOR SELECT * FROM films;

-- 从游标 liahona 中提取前 5 行:
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 PRIOR FROM liahona;

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

-- 关闭游标并结束事务:
CLOSE liahona;
COMMIT WORK;

兼容性

SQL 标准只为嵌入式 SQL 定义了FETCH。 这里描述的FETCH变体会像 SELECT结果那样返回数据,而不是把数据放入主变量中。 除此之外,FETCH与 SQL 标准完全向上兼容。

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

SQL 标准只允许在游标名之前使用FROM;允许使用 IN,或者将两者都完全省略,都是扩展。

另见

CLOSE, DECLARE, MOVE