Note

FETCH

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

Synopsis

FETCH [ direction [ FROM | IN ] ] cursor_name

where direction can be empty or 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 42.7.3

Parameters

  • 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

    • 打开游标的名称。

Outputs

成功完成后,FETCH命令将返回以下形式的命令标签:

FETCH count
  • count *是获取的行数(可能为零)。请注意,在 psql 中,实际上不会显示 command 标记,因为 psql 而是显示提取的行。

Notes

如果打算使用FETCH NEXTFETCH FORWARD以外的任何其他FETCH变体(带有正计数),则应使用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形式以及FORWARD是隐式的FETCH countFETCH ALL形式是 PostgreSQL 扩展。

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

See Also

CLOSE, DECLARE, MOVE