↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本PostgreSQL 7.3 已于 2007 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

FETCH

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

等价于指定数量 1。

PRIOR

等价于指定数量 -1。

cursor

一个已打开游标的名称。

输出

FETCH返回由指定游标定义的查询的结果。如果查询失败,将返回下列消息:

WARNING: PerformPortalFetch: portal "cursor" not found

如果cursor 此前未被声明。游标必须在事务块内声明。

WARNING: FETCH/ABSOLUTE not supported, using RELATIVE

PostgreSQL不支持游标的绝对定位。

ERROR: FETCH/RELATIVE at current position is not supported

SQL92允许使用语法

FETCH RELATIVE 0 FROM cursor.
        

反复检索游标“当前位置”上的行。

PostgreSQL目前不支持这一概念;实际上,值零被保留用来表示要检索所有行,等价于指定 ALL 关键字。如果使用了 RELATIVE 关键字,PostgreSQL 假定用户想要的是 SQL92行为,并返回这条错误消息。

描述

FETCH允许用户使用游标检索行。检索的行数由 # 指定。如果游标中剩余的行数少于 #,则只提取那些可用的行。 用关键字 ALL 代替数字将检索游标中所有剩余的行。 可以沿 FORWARD 和 BACKWARD 两个方向提取行。默认方向是 FORWARD。

提示

行数允许指定为负数。负数等价于反转 FORWARD 和 BACKWARD 关键字的方向。例如,FORWARD -1与BACKWARD 1相同。

注意

注意,FORWARD 和 BACKWARD 关键字是 PostgreSQL扩展。也支持 SQL92语法,即命令的第二种形式。关于兼容性问题的细节见下文。

PostgreSQL不支持通过游标更新数据,因为把游标更新映射回基表通常不可行,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;

兼容性

SQL92

注意

游标的非嵌入式使用是PostgreSQL 扩展。这里把游标的语法和用法与SQL92 定义的嵌入式游标形式相比较。

SQL92允许 FETCH 绝对定位游标,并允许把结果放入显式变量:

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

游标应被定位到指定的绝对行号。PostgreSQL 中的所有行号都是相对编号,因此不支持这一能力。

:variable

目标主变量。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。