pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
FETCH — 使用游标获取行
FETCH [selector] [count] { IN | FROM }cursorFETCH [ RELATIVE ] [ { [#| ALL | NEXT | PRIOR ] } ] FROM ]cursor
selectorselector 定义提取方向。它可以是下列之一:
提取下一个(或下一些)行。如果省略 selector,这是默认值。
提取前一个(或前一些)行。
为兼容 SQL92 而存在的噪声词。
countcount 决定提取多少行。它可以是下列之一:
#一个有符号整数,指定要提取多少行。注意,负整数等价于反转 FORWARD 和 BACKWARD 的方向。
检索所有剩余的行。
等价于指定数量 1。
等价于指定数量 -1。
cursor一个已打开游标的名称。
FETCH返回由指定游标定义的查询的结果。如果查询失败,将返回下列消息:
NOTICE: PerformPortalFetch: portal "cursor" not found如果cursor 此前未被声明。游标必须在事务块内声明。
NOTICE: FETCH/ABSOLUTE not supported, using RELATIVEPostgres不支持游标的绝对定位。
ERROR: FETCH/RELATIVE at current position is not supportedSQL92允许使用语法
FETCH RELATIVE 0 FROM cursor
反复检索游标"当前位置"上的行。
Postgres目前不支持这一概念;实际上,值零被保留用来表示要检索所有行,等价于指定 ALL 关键字。如果使用了 RELATIVE 关键字,Postgres 假定用户想要的是 SQL92行为,并返回这条错误消息。
FETCH 允许用户使用游标检索行。检索的行数由 # 指定。如果游标中剩余的行数少于 #,则只提取那些可用的行。 用关键字 ALL 代替数字将检索游标中所有剩余的行。 可以沿 FORWARD 和 BACKWARD 两个方向提取行。默认方向是 FORWARD。
现在允许把行数指定为负数。负数等价于反转 FORWARD 和 BACKWARD 关键字的方向。例如,FORWARD -1与BACKWARD 1相同。
注意,FORWARD 和 BACKWARD 关键字是 Postgres扩展。也支持 SQL92语法,即命令的第二种形式。关于兼容性问题的细节见下文。
一旦所有行都被提取,之后的每次提取访问都不再返回行。
Postgres不支持通过游标更新数据,因为把游标更新映射回基表通常不可行,VIEW 更新也是同样的情况。因此,用户必须发出显式的 UPDATE 命令来替换数据。
游标只能在事务内部使用,因为它们保存的数据跨越用户的多次查询。
使用 MOVE 来改变游标位置。 DECLARE 用于定义游标。 关于事务的更多信息,请参阅 BEGIN、 COMMIT 和 ROLLBACK。
--set up and use a cursor:
--
BEGIN WORK;
DECLARE liahona CURSOR
FOR SELECT * FROM films;
--Fetch first 5 rows in the cursor liahona:
--
FETCH FORWARD 5 IN 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 previous row:
--
FETCH BACKWARD 1 IN liahona;
code |title |did| date_prod|kind |len
-----+-----------------------+---+----------+----------+------
P_301|Vertigo |103|1958-11-14|Action | 02:08
-- close the cursor and commit work:
--
CLOSE liahona;
COMMIT WORK;
游标的非嵌入式使用是Postgres 扩展。这里把游标的语法和用法与SQL92 定义的嵌入式游标形式相比较。
SQL92允许 FETCH 绝对定位游标,并允许把结果放入显式变量:
FETCH ABSOLUTE#FROMcursorINTO :variable[, ...]
游标应被定位到指定的绝对行号。Postgres 中的所有行号都是相对编号,因此不支持这一能力。
variable目标主变量。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。