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

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 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 标准定义 FETCH 专门用于嵌入式 SQL 中。此处描述的 FETCH 变量返回的数据格式就像 SELECT 结果,而不是将其放在主机变量中。除了这一点之外,FETCH 与 SQL 标准完全向上兼容。

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

SQL 标准只允许在光标名称之前使用 FROM;使用 IN,或将其全部留出,则是扩展。

另请参见

CLOSEDECLAREMOVE