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或完全不使用它们的选项是扩展。