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
运行到可用行的末尾,则游标将位于最后一行之后,如果向后获取,则位于第一行之前。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 标准仅定义在嵌入式 SQL 中使用 FETCH
。此处描述的 FETCH
变体返回数据,就好像它是 SELECT
结果一样,而不是将其放置在主机变量中。除此之外,FETCH
完全向上兼容 SQL 标准。
涉及 FORWARD
和 BACKWARD
的 FETCH
形式,以及 FETCH
和 count
FETCH ALL
形式(其中 FORWARD
是隐式的)是 PostgreSQL 扩展。
SQL 标准只允许在游标名称之前使用 FROM
;使用 IN
或完全省略它们是扩展。
如果您在文档中看到任何不正确、与您使用特定功能的体验不符或需要进一步澄清的内容,请使用此表格报告文档问题。