Postgresql 中文操作指南
Synopsis
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
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 43.7.3 。
Parameters
-
direction
-
direction 定义了获取方向以及要获取的行数。它可以是以下选项之一:
-
-
count
-
count 是一个可能带符号的整数常量,它决定了要获取的行数或位置。对于 FORWARD 和 BACKWARD 情况,指定一个负的 count 等效于更改 FORWARD 和 BACKWARD 的含义。
-
-
cursor_name
-
An open cursor’s name.
-
-
NEXT
-
获取下一行。如果 direction 被省略,这是默认值。
-
-
PRIOR
-
Fetch the prior row.
-
-
FIRST
-
获取查询的第一行(与 ABSOLUTE 1 相同)。
-
-
LAST
-
获取查询的最后一行(与 ABSOLUTE -1 相同)。
-
-
ABSOLUTE _count_
-
获取查询的第 count 行,或 abs(_count ) 'th row from the end if _count 为负数。如果 count 超出范围,则在第一行前或最后一行后定位;特别是, ABSOLUTE 0 定位于第一行前。
-
-
RELATIVE _count_
-
获取第 count 个后续行,或 abs(_count ) 'th prior row if _count 为负数。 RELATIVE 0 重新获取当前行(如有)。
-
-
count
-
获取接下来的 count 行(与 FORWARD _count_ 相同)。
-
-
ALL
-
获取所有剩余行(与 FORWARD ALL 相同)。
-
-
FORWARD
-
获取下一行(与 NEXT 相同)。
-
-
FORWARD _count_
-
获取接下来的 count 行。 FORWARD 0 重新获取当前行。
-
-
FORWARD ALL
-
Fetch all remaining rows.
-
-
BACKWARD
-
获取前一行(与 PRIOR 相同)。
-
-
BACKWARD _count_
-
获取前 count 行(向后扫描)。 BACKWARD 0 重新获取当前行。
-
-
BACKWARD ALL
-
获取所有前行(向后扫描)。
-
Outputs
在成功完成时,一个 FETCH 命令会返回类似于以下形式的命令标记
FETCH count
count 是获取的行数(可能为零)。注意在 psql 中,命令标记不会实际显示,因为 psql 会显示获取的行。
Notes
如果打算使用 FETCH ( FETCH NEXT 或 FETCH FORWARD 除外)的任何变量,且计数为正,则游标应使用 SCROLL 选项声明。对于简单的查询,PostgreSQL 将允许从未使用 SCROLL 声明的游标向后获取,但最好不要依赖此行为。如果游标使用 NO SCROLL 声明,则不允许向后获取。
ABSOLUTE 抓取的效率并不比通过相对移动方式来导航到所需行更高:底层实现必须遍历所有介于其中的行。负绝对抓取更糟糕:必须读取查询直到最后一行,然后从那里向后遍历。但是,倒带回查询的开始(对于 FETCH ABSOLUTE 0 而言)是快速的。
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;