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

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 6.4 已于 2003 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

FETCH

FETCH — 使用游标获取行

大纲

FETCH [ selector ] [ count ] { IN | FROM } cursor
FETCH [ RELATIVE ] [ { [ # | ALL | NEXT | PRIOR ] } ] FROM ] cursor

输入

selector

selector 定义提取方向。它可以是 下列之一:

FORWARD

提取下一个(或下一些)行。如果省略 selector,这是默认值。

BACKWARD

提取前一个(或前一些)行。

RELATIVE

为兼容 SQL92 而存在的噪声词。

count

count 决定提取多少行。它可以是下列之一:

#

一个有符号整数,指定要提取多少行。注意,负整数等价于反转 FORWARD 和 BACKWARD 的方向。

ALL

检索所有剩余的行。

NEXT

等价于指定数量 1。

PRIOR

等价于指定数量 -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 语句来声明游标。 参阅 BEGIN WORK、COMMIT WORK、ROLLBACK WORK 语句 以获得关于事务的更多信息。

用法

   --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

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

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

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

:variable

目标主变量。

提交更正

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