FETCH
Name
FETCH -- 用游标从查询中抓取行
Synopsis
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 都要求在不移动游标的前提下抓取当前行,也就是重新抓取最近刚刚抓取过的行。 除非游标定位在第一行之前或者最后一行之后,这个动作都应该成功, 而在那两种情况下,不返回任何行。
Note: 本页描述在SQL命令级别的游标的使用。如果你尝试在PL/pgSQL 里使用游标,那么规则是不同的,参阅Section 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,或者把它们都省去,是一个扩展。