On this page
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 ALL
或FETCH BACKWARD ALL
将始终使光标位于最后一行之后或第一行之前。
形式NEXT
,PRIOR
,FIRST
,LAST
,ABSOLUTE
,RELATIVE
适当地移动了光标之后,获取了一行。如果没有这样的行,则返回空结果,并且光标将视情况放在第一行之前或最后一行之后。
使用FORWARD
和BACKWARD
的表单将检索指定的向前或向后移动的行数,将光标留在最后返回的行上(如果* count
*超过可用的行数,则将光标定位在最后返回的行上) 。
RELATIVE 0
,FORWARD 0
和BACKWARD 0
都请求在不移动光标的情况下获取当前行,即重新获取最近获取的行。除非光标位于第一行之前或最后一行之后,否则此操作将成功。在这种情况下,不会返回任何行。
Note
本页在 SQL 命令级别描述游标的用法。如果您尝试在 PL/pgSQL 函数中使用游标,则规则有所不同—参见Section 42.7.3。
Parameters
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
相同)。
- 提取接下来的*
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
- 打开游标的名称。
Outputs
成功完成后,FETCH
命令将返回以下形式的命令标签:
FETCH count
count
*是获取的行数(可能为零)。请注意,在 psql 中,实际上不会显示 command 标记,因为 psql 而是显示提取的行。
Notes
如果打算使用FETCH NEXT
或FETCH 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 标准完全向上兼容。
涉及FORWARD
和BACKWARD
的FETCH
形式以及FORWARD
是隐式的FETCH count
和FETCH ALL
形式是 PostgreSQL 扩展。
SQL 标准只允许在游标名称前加FROM
;使用IN
或完全不使用它们的选项是扩展。