跳转至

DECLARE

DECLARE

定义一个游标。

语法
sql DECLARE name [BINARY] [INSENSITIVE] [NO SCROLL] CURSOR [{WITH | WITHOUT} HOLD] FOR query [FOR READ ONLY]
描述

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

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

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

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

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

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

参数

该SQL命令参数说明见下

name
要创建的游标的名称。
BINARY
使光标返回二进制而不是文本格式的数据。
INSENSITIVE
指示在存在游标时,从游标检索的数据应不受游标基于的表更新的影响。 在SeaboxMPP数据库中,所有游标都不敏感。该关键字当前不起作用,出现是为了与SQL标准兼容。
NO SCROLL
游标不能用于以非顺序方式检索行。 这是SeaboxMPP数据库中的默认行为,因为不支持滚动游标(SCROLL)。
WITH HOLD | WITHOUT HOLD

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

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

query

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

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

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

  • 仅引用一张表。

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

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

  • 分组子句

  • 集合操作,例如UNION ALLUNION DISTINCT

  • 排序子句

  • 窗口子句

  • 连接或自连接

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

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

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

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

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

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

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

列存表不支持DECLARE...FOR UPDATE

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

示例

声明一个游标:

DECLARE mycursor CURSOR FOR SELECT * FROM mytable;
兼容性说明
SQL标准仅允许在嵌入式SQL和模块中使用游标。 SeaboxMPP数据库允许以交互方式使用游标。SeaboxMPP数据库未为游标实现OPEN语句。 当游标被声明时,它被认为是打开的。SQL标准允许游标向前和向后移动。 所有SeaboxMPP数据库游标仅向前移动(不可滚动)。二进制游标是SeaboxMPP数据库扩展。
相关SQL命令
CLOSE, DELETE, FETCH, MOVE, SELECT, UPDATE