PostgreSQL 9.4.4 中文手册
上一页 | 上一级 |  | 下一页

# FETCH

## 名称

FETCH -- 用游标从查询中抓取行

## 大纲

    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`将总是把游标的位置放在最后一行或者在第一行前面。

`NEXT`, `PRIOR`, `FIRST`, `LAST`, `ABSOLUTE`, `RELATIVE`形式在恰当地移动游标之后抓取一个行。 如果没有数据行了，那么返回一个空的结果，此时游标就会停在查询结果的最后一行之后或者第一行之前。

`FORWARD`和`BACKWARD`形式在向前或者向后移动的过程中抓取指定的行数， 然后把游标定位在最后返回的行上；或者是，如果`count` 大于可用的行数，则在所有行之前或之后。

`RELATIVE 0`, `FORWARD 0`, `BACKWARD 0` 都要求在不移动游标的前提下抓取当前行，也就是重新抓取最近刚刚抓取过的行。 除非游标定位在第一行之前或者最后一行之后，这个动作都应该成功， 而在那两种情况下，不返回任何行。

> 注意: 本页描述在SQL命令级别的游标的使用。如果你尝试在PL/pgSQL 里使用游标，那么规则是不同的，参阅第 40.7 节。

## 参数

`direction`

  `direction`定义抓取的方向和抓取的行数。 它可以是下述之一：

  `NEXT`

    抓取下一行(缺省)。

  `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`变种，或者是带负数计数的 `FETCH FORWARD`，那么定义游标的时候应该带上`SCROLL`选项。 对于简单的查询，PostgreSQL会允许那些没有带`SCROLL` 选项定义的游标也可以反向抓取，但是最好不要依赖这个行为。如果游标定义了 `NO SCROLL`，那么不允许反向抓取。

`ABSOLUTE`抓取不会比用相对位移移动到需要的数据行更快： 因为下层的实现必须遍历所有中间的行。负数的绝对抓取甚至更糟糕： 查询必须一直读到结尾才能找到最后一行，然后从那里开始反向遍历。不过， 回退到查询开头(比如`FETCH ABSOLUTE 0`)很快。

使用DECLARE语句定义一个游标。MOVE 语句改变游标位置而不检索数据。

## 例子

下面的例子用一个游标跨过一个表。

    BEGIN WORK;

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

    -- 抓取头5行到游标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 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 标准定义的`FETCH`只用于嵌入式环境下。这里描述的 `FETCH`变种是把结果数据像`SELECT`结果那样返回， 而不是把它放在属主变量里。除了这点之外，`FETCH` 和 SQL 标准完全向前兼容。

涉及`FORWARD`和`BACKWARD`的`FETCH`形式， 包括`FETCH `count``和 `FETCH ALL`形式(此时`FORWARD`是隐含的)， 是PostgreSQL的扩展。

SQL 标准只允许游标前面有`FROM`，可选的`IN`，或者把它们都省去，是一个扩展。

## 又见

CLOSE, DECLARE, MOVE

上一页 | 起始页 | 下一页
EXPLAIN | 上一级 | GRANT