DECLARE

定义一个游标。

概要

  1. DECLARE name [BINARY] [INSENSITIVE] [NO SCROLL] CURSOR
  2. [{WITH | WITHOUT} HOLD]
  3. FOR query [FOR READ ONLY]

描述

DECLARE允许用户创建游标,该游标可用于一次从较大查询中检索少量行。 游标可以使用FETCH以文本或二进制格式返回数据。

Note: 本页在SQL命令级别描述游标的用法。 如果试图在PL/pgSQL函数中使用游标,则规则是不同的。 参见Greenplum PL/pgSQL过程语言

普通游标以文本格式返回数据,与SELECT会产生相同的结果。 由于数据本身以二进制格式存储,因此系统必须进行转换以产生文本格式。 一旦信息以文本形式返回,客户端应用程序可能需要将其转换为二进制格式以进行操作。 另外,文本格式的数据通常比二进制格式的数据大。 二进制游标以二进制表示形式返回数据,可能更易于操作。 但是,如果您仍然打算将数据显示为文本,则以文本形式检索数据将节省您在客户端的工作量。

例如,如果查询从整数列返回值1,则将使用默认游标获得字符串1,而使用二进制游标将获得包含值的内部表示形式的4字节字段(在大端字节序)。

二进制游标应谨慎使用。许多应用程序,包括psql,都不准备处理二进制游标,并希望数据以文本格式返回。

Note:

当客户端应用程序使用“扩展查询”协议发出FETCH命令时,“绑定协议”消息指定是以文本还是二进制格式检索数据。 此选择将覆盖定义光标的方式。 因此,当使用扩展查询协议时,二进制游标的概念就已过时了 - 任何游标都可以视为文本或二进制。

可以在UPDATEDELETE语句的WHERE CURRENT OF子句中指定游标,以更新或删除表数据。 UPDATE或DELETE语句只能在服务器上执行,例如在交互式psql会话或脚本中。 语言扩展(例如PL/pgSQL)不支持可更新的游标。

参数

name

要创建的游标的名称。

BINARY

使光标返回二进制而不是文本格式的数据。

INSENSITIVE

指示在存在游标时,从游标检索的数据应不受游标基于的表更新的影响。 在Greenplum数据库中,所有游标都不敏感。 该关键字当前不起作用,出现是为了与SQL标准兼容。

NO SCROLL

游标不能用于以非顺序方式检索行。 这是Greenplum数据库中的默认行为,因为不支持滚动游标(SCROLL)。

WITH HOLD

WITHOUT HOLD

WITH HOLD指定在成功创建游标的事务提交后可以继续使用游标。 WITHOUT HOLD指定不能在创建游标的事务之外使用游标。 默认为WITHOUT HOLD。

当query包含FOR UPDATE或FOR SHARE子句时,不能指定WITH HOLD。

query

SELECTVALUES命令,它将提供游标要返回的行。

如果在UPDATEDELETE命令的WHERE CURRENT OF子句中使用了游标, 则SELECT命令必须满足以下条件:

  • 无法引用视图或外部表。
  • 仅引用一张表。

    该表必须是可更新的。例如,以下内容不可更新:表函数,返回集合的函数,仅追加表,列式表。

  • 不能包含以下任何内容:

    • 分组子句
    • 集合操作,例如UNION ALL或UNION DISTINCT
    • 排序子句
    • 窗口子句
    • 连接或自连接

    在SELECT命令中指定FOR UPDATE子句可防止其他会话在获取行和更新行之间更改行。 如果没有FOR UPDATE子句,则在创建游标以后更改了行, 随后将UPDATE或DELETE命令与WHERE CURRENT OF子句一起使用将无效。

    Note: 在SELECT命令中指定FOR UPDATE子句将锁定整个表,而不只是选定的行。

FOR READ ONLY

FOR READ ONLY表示光标以只读模式使用。

注解

除非指定了WITH HOLD,否则此命令创建的游标只能在当前事务中使用。 因此,不带WITH HOLD的DECLARE在事务块之外是无用的:游标只能生存到语句完成。 因此,如果在事务块外部使用此命令,Greenplum数据库将报告错误。 使用BEGIN和COMMIT(或ROLLBACK)定义事务块。

如果指定了WITH HOLD,并且成功提交了创建游标的事务,则该游标可以继续被同一会话中的后续事务访问。 (但是,如果创建事务被中止,则删除游标。)当对它发出显式CLOSE命令或会话结束时,将关闭用WITH HOLD创建的游标。 在当前实现中,由保留的游标表示的行被复制到临时文件或存储区中,以便它们可用于后续事务。

如果在事务中使用DECLARE命令创建游标, 则只有在使用CLOSE命令关闭游标后才能在事务中使用SET命令。

Greenplum数据库当前不支持可滚动光标。 您只能使用FETCH将光标位置向前移动,而不能向后移动。

追加优化表不支持DECLARE…FOR UPDATE。

您可以通过查询pg_cursors系统视图来查看所有可用的游标。

示例

声明一个游标:

  1. DECLARE mycursor CURSOR FOR SELECT * FROM mytable;

兼容性

SQL标准仅允许在嵌入式SQL和模块中使用游标。 Greenplum数据库允许以交互方式使用游标。

Greenplum数据库未为游标实现OPEN语句。 当游标被声明时,它被认为是打开的。

SQL标准允许游标向前和向后移动。 所有Greenplum数据库游标仅向前移动(不可滚动)。

二进制游标是Greenplum数据库扩展。

另见

CLOSE, DELETE, FETCH, MOVE, SELECT, UPDATE

Parent topic: SQL Command Reference