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

Outputs

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

FETCH count

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

上一章 首页 下一章