FETCH — 使用游标从查询中检索行
FETCH [direction
] [ FROM | IN ]cursor_name
wheredirection
can be one of: NEXT PRIOR FIRST LAST ABSOLUTEcount
RELATIVEcount
count
ALL FORWARD FORWARDcount
FORWARD ALL BACKWARD BACKWARDcount
BACKWARD ALL
命令
使用先前创建的游标检索行。
光标有一个关联的位置,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 函数中使用光标,则规则会有所不同 — 请参阅 第 41.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
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
变体(除 FETCH NEXT
或计数为正的 FETCH FORWARD
外),应使用 SCROLL
选项声明游标。对于简单的查询,PostgreSQL 将允许从未使用 SCROLL
声明的游标中向后获取,但最好不要依靠此行为。如果使用 NO SCROLL
声明游标,则不允许向后获取。
ABSOLUTE
提取操作并不比使用相对移动导航到所需行更快:基础实施必须遍历所有中间行。负绝对提取操作更糟糕:必须读取查询到末尾才能找到最后一行,然后从那里向后遍历。然而,重新定位到查询开始(使用 FETCH ABSOLUTE 0
时如此)速度很快。
以下示例使用光标遍历一张表
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
,或将其全部留出,则是扩展。