| PostgreSQL | ||
|---|---|---|
| 上一页 | 下一页 | |
FETCH — 用游标获取行
FETCH [ selector ] [ count ] { IN | FROM } cursor
FETCH [ RELATIVE ] [ { [ # | ALL | NEXT | PRIOR ] } ] FROM ] cursor
FETCH 返回由声明的游标定义的查询的结果.如果查询失败,将返回下面的信息:
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 #
FROM cursor
INTO :variable [, ...]
| 上一页 | 首页 | 下一页 |
| EXPLAIN | 开头 | GRANT |