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
,或者把它们都省去,是一个扩展。