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 ALL 或 FETCH BACKWARD ALL 将始终将游标定位在最后一行之后或第一行之前。

形式 NEXT、PRIOR、FIRST、LAST、ABSOLUTE、RELATIVE 在适当地移动游标后获取单行。如果不存在这样的行,则返回一个空结果,并且游标会根据情况定位在第一行之前或最后一行之后。

使用 FORWARD 和 BACKWARD 的形式在向前或向后方向上检索指示数量的行,将游标定位在最后返回的行上(如果 count 超过可用行数,则定位在所有行之后/之前)。

RELATIVE 0、FORWARD 0 和 BACKWARD 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 是一个可能的带符号整数常量,用于确定要获取的位置或行数。对于 FORWARD 和 BACKWARD 的情况,指定负数 count 等同于改变 FORWARD 和 BACKWARD 的方向。

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;

-- 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 标准完全向上兼容。

涉及 FORWARD 和 BACKWARD 的 FETCH 形式,以及 FETCH count 和 FETCH ALL 形式(在这些形式中,FORWARD 是隐式的),是 PostgreSQL 的扩展。

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

另请参阅

CLOSE, DECLARE, MOVE