FETCH
FETCH — 使用游标从查询中检索行
语法
FETCH [ direction ] [ FROM | IN ] cursor_name
where direction can be one of:
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函数中使用游标,则规则不同 — 请参见第 43.7.3 节。
参数
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
全部
获取所有剩余行(与
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
的任何变体(而不是FETCH NEXT
或FETCH FORWARD
和正计数),则应使用SCROLL
选项声明游标。对于简单的查询,PostgreSQL将允许从未使用SCROLL
声明的游标中向后获取,但最好不要依赖此行为。如果使用NO SCROLL
声明游标,则不允许向后获取。
ABSOLUTE
获取并不比使用相对移动导航到所需行更快:底层实现必须遍历所有中间行。负绝对获取甚至更糟:必须读取查询到最后以查找最后一行,然后从那里向后遍历。但是,快退到查询的开头(如FETCH ABSOLUTE 0
)很快。
DECLARE
用于定义游标。使用MOVE
更改游标位置,而不检索数据。
示例
以下示例使用游标遍历表
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;
兼容性
SQL 标准定义FETCH
仅用于嵌入式 SQL。此处描述的FETCH
变体将数据返回为SELECT
结果,而不是将其放入主机变量中。除了这一点之外,FETCH
与 SQL 标准完全向上兼容。
涉及FORWARD
和BACKWARD
的FETCH
形式,以及FETCH*
count*
和FETCH ALL
形式(其中FORWARD
是隐式的),是PostgreSQL扩展。
SQL 标准只允许游标名称之前有FROM
;使用IN
或完全省略它们的选项是扩展。