DECLARE

定义一个游标。

概要

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

描述

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

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

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

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

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

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

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

参数

name

要创建的游标的名称。 BINARY 使光标返回二进制而不是文本格式的数据。 INSENSITIVE 指示在存在游标时,从游标检索的数据应不受游标基于的表更新的影响。 在Greenplum数据库中,所有游标都不敏感。 该关键字当前不起作用,出现是为了与SQL标准兼容。

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

WITH HOLD WITHOUT HOLD

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

query包含FOR UPDATEFOR SHARE子句时,不能指定WITH HOLD

query

[SELECT](SELECT.html#topic1)[VALUES](VALUES.html#topic1)命令,它将提供游标要返回的行。 如果在[UPDATE](UPDATE.html#topic1)[DELETE](DELETE.html#topic1)命令的WHERE CURRENT OF子句中使用了游标, 则SELECT命令必须满足以下条件:

  • 无法引用视图或外部表。
  • 仅引用一张表。 该表必须是可更新的。例如,以下内容不可更新:表函数,返回集合的函数,仅追加表,列式表。
  • 不能包含以下任何内容:
    • 分组子句
    • 集合操作,例如UNION ALLUNION DISTINCT
    • 排序子句
    • 窗口子句
    • 连接或自连接在SELECT命令中指定FOR UPDATE子句可防止其他会话在获取行和更新行之间更改行。 如果没有FOR UPDATE子句,则在创建游标以后更改了行, 随后将UPDATEDELETE命令与WHERE CURRENT OF子句一起使用将无效。

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

FOR READ ONLY

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

注解

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

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

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

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

追加优化表不支持DECLARE...FOR UPDATE

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

示例

声明一个游标:

DECLARE mycursor CURSOR FOR SELECT * FROM mytable;

兼容性

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

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

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

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

另见

[CLOSE](CLOSE.html#topic1), [DELETE](DELETE.html#topic1), [FETCH](FETCH.html#topic1), [MOVE](MOVE.html#topic1), [SELECT](SELECT.html#topic1), [UPDATE](UPDATE.html#topic1)

Parent topic: SQL Command Reference

当前内容版权归GreenPlum和翻译组所有,若有侵权请联系删除下架 修订时间: 2024-09-15 21:48:10

results matching ""

    No results matching ""