DECLARE
DECLARE
定义一个游标。
概要
DECLARE name [BINARY] [INSENSITIVE] [NO SCROLL] CURSOR [{WITH | WITHOUT} HOLD] FOR query [FOR READ ONLY]
描述
DECLARE允许用户创建游标,该游标可用于一次从较大查询中检索少量行。 游标可以使用FETCH以文本或二进制格式返回数据。
普通游标以文本格式返回数据,与SELECT会产生相同的结果。 由于数据本身以二进制格式存储,因此系统必须进行转换以产生文本格式。 一旦信息以文本形式返回,客户端应用程序可能需要将其转换为二进制格式以进行操作。 另外,文本格式的数据通常比二进制格式的数据大。 二进制游标以二进制表示形式返回数据,可能更易于操作。 但是,如果您仍然打算将数据显示为文本,则以文本形式检索数据将节省您在客户端的工作量。
例如,如果查询从整数列返回值1,则将使用默认游标获得字符串1,而使用二进制游标将获得包含值的内部表示形式的4字节字段(在大端字节序)。
二进制游标应谨慎使用。许多应用程序,包括psql,都不准备处理二进制游标,并希望数据以文本格式返回。
当客户端应用程序使用“扩展查询”协议发出FETCH命令时,“绑定协议”消息指定是以文本还是二进制格式检索数据。 此选择将覆盖定义光标的方式。 因此,当使用扩展查询协议时,二进制游标的概念就已过时了 - 任何游标都可以视为文本或二进制。
可以在UPDATE或DELETE语句的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
-
SELECT或VALUES命令,它将提供游标要返回的行。
如果在UPDATE或DELETE命令的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系统视图来查看所有可用的游标。
示例
声明一个游标:
DECLARE mycursor CURSOR FOR SELECT * FROM mytable;
兼容性
SQL标准仅允许在嵌入式SQL和模块中使用游标。 Greenplum数据库允许以交互方式使用游标。
Greenplum数据库未为游标实现OPEN语句。 当游标被声明时,它被认为是打开的。
SQL标准允许游标向前和向后移动。 所有Greenplum数据库游标仅向前移动(不可滚动)。
二进制游标是Greenplum数据库扩展。