FETCH

Name

FETCH — 用游标获取行
FETCH [ direction ] [ count ] { IN | FROM } cursor
FETCH [ FORWARD | BACKWARD | RELATIVE ] [ # | ALL | NEXT | PRIOR ] { IN | FROM } cursor
  

输入

direction

selector 定义抓取的方向.它可以是下述之一:

FORWARD

抓取后面的行. selector 省略时这是缺省值.

BACKWARD

抓取前面行.

RELATIVE

为 SQL92 兼容设置的多余键字.

count

count 决定抓取几行.可以是下列之一:

#

一个表明抓取几行的整数. 注意负整数等效于改变 FORWARD 和 BACKWARD 属性.

ALL

检索所有剩余的行.

NEXT

等效于声明 count 为 1

PRIOR

等效于声明 count 为 -1.

cursor

一个打开的游标的名称.

输出

FETCH 返回由声明游标定义的查询结果. 如果查询失败,将返回下面的信息:

NOTICE: PerformPortalFetch: portal "cursor" not found

如果 cursor 在前面没有定义,返回此信息.游标必须在一个事务块中定义.

NOTICE: FETCH/ABSOLUTE not supported, using RELATIVE

Postgres 不支持游标的绝对定位.

ERROR: FETCH/RELATIVE at current position is not supported

SQL92 允许我们用下面语句在"当前位置"不停地检索游标

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 语句定义一个游标.使用 BEGINCOMMIT, 和 ROLLBACK 语句获取更多关于事务的信息.

用法

下面的例子用一个游标跨过一个表。

-- 建立一个游标:

BEGIN WORK;
DECLARE liahona CURSOR FOR SELECT * FROM films;

-- 抓取头 5 行到游标 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 BACKWARD 1 IN liahona;

 code  | title   | did | date_prod  | kind   | len
-------+---------+-----+------------+--------+-------
 P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08

-- 关闭游标并提交事务:

CLOSE liahona;
COMMIT WORK;

兼容性

SQL92

注意: 非嵌入式游标的使用是 Postgres 扩展.游标的语法和用途与定义与 SQL92 里定义的嵌入式用法相似。

SQL92 允许游标在 FETCH 中的绝对定位, 并且允许将结果放在明确的变量里:

FETCH ABSOLUTE #
    FROM cursor
    INTO :variable [, ...]
    

ABSOLUTE

游标将放置在写明的绝对的行数的位置上.在 Postgres 中所有的行数都是相对数量,所以这一功能不支持.

:variable

目标宿主变量.