FETCH — 使用游标从查询中检索行
FETCH [direction] [ FROM | IN ]cursor_namewheredirectioncan be one of: NEXT PRIOR FIRST LAST ABSOLUTEcountRELATIVEcountcountALL FORWARD FORWARDcountFORWARD ALL BACKWARD BACKWARDcountBACKWARD 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 节。
directiondirection 定义获取方向和要获取的行数。它可以是以下之一:
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获取所有先前的行(向后扫描)。
countcount 是一个可能带符号的整数常量,确定要获取的位置或行数。对于 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 和 countFETCH ALL 形式(其中 FORWARD 是隐式的)是 PostgreSQL 扩展。
SQL 标准只允许在游标名称之前使用 FROM;使用 IN 或完全省略它们是扩展。
如果您在文档中看到任何不正确、与您使用特定功能的体验不符或需要进一步澄清的内容,请使用此表格报告文档问题。