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
命令时,“绑定协议”消息指定是以文本还是二进制格式检索数据。 此选择将覆盖定义光标的方式。因此,当使用扩展查询协议时,二进制游标的概念就已过时了 - 任何游标都可以视为文本或二进制。
可以在
UPDATE
或DELETE
语句的WHERE CURRENT OF
子句中指定游标,以更新或删除表数据。UPDATE
或DELETE
语句只能在服务器上执行,例如在交互式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 UPDATE
或FOR SHARE
子句时,不能指定WITH HOLD
。 query
-
SELECT
或VALUES
命令,它将提供游标要返回的行。如果在
UPDATE
或DELETE
命令的WHERE CURRENT OF
子句中使用了游标,则SELECT
命令必须满足以下条件:-
无法引用视图或外部表。
-
仅引用一张表。
该表必须是可更新的。例如,以下内容不可更新:表函数,返回集合的函数,仅追加表,列式表。
-
不能包含以下任何内容:
-
分组子句
-
集合操作,例如
UNION ALL
或UNION DISTINCT
-
排序子句
-
窗口子句
-
连接或自连接
在
SELECT
命令中指定FOR UPDATE
子句可防止其他会话在获取行和更新行之间更改行。 如果没有FOR UPDATE
子句,则在创建游标以后更改了行, 随后将UPDATE
或DELETE
命令与WHERE CURRENT OF
子句一起使用将无效。注意: 在
SELECT
命令中指定FOR UPDATE
子句将锁定整个表,而不只是选定的行。
-
FOR READ ONLY
FOR READ ONLY
表示光标以只读模式使用。
- 注解
-
除非指定了
WITH HOLD
,否则此命令创建的游标只能在当前事务中使用。 因此,不带WITH HOLD
的DECLARE
在事务块之外是无用的:游标只能生存到语句完成。因此,如果在事务块外部使用此命令,SeaboxMPP数据库将报告错误。使用BEGIN
和COMMIT
(或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