# 宣布
DECLARE — 定义一个游标
# 概要
DECLARE name [ BINARY ] [ ASENSITIVE | INSENSITIVE ] [ [ NO ] SCROLL ]
CURSOR [ { WITH | WITHOUT } HOLD ] FOR query
# 描述
宣布
允许用户创建游标,可用于从较大的查询中一次检索少量行。创建游标后,使用从中获取行拿来
.
# 笔记
本页描述了 SQL 命令级别的游标的使用。如果您尝试在 PL/pgSQL 函数中使用游标,则规则不同 — 请参阅第 43.7 节.
# 参数
姓名
要创建的光标的名称。
二进制
使游标以二进制而不是文本格式返回数据。
敏感的
不敏感
游标敏感度决定了在游标声明之后,在同一事务中完成的游标基础数据的更改是否在游标中可见。不敏感
意味着它们不可见,敏感的
表示行为依赖于实现。第三种行为,敏感的
,这意味着此类更改在游标中可见,在 PostgreSQL 中不可用。在 PostgreSQL 中,所有游标都是不敏感的;所以这些关键字没有任何作用,只是为了与 SQL 标准兼容而被接受。
指定不敏感
和...一起更新
要么分享
是一个错误。
滚动
无滚动
滚动
指定游标可用于以非顺序方式(例如,向后)检索行。根据查询执行计划的复杂性,指定滚动
可能会对查询的执行时间造成性能损失。无滚动
指定游标不能用于以非顺序方式检索行。默认是在某些情况下允许滚动;这与指定不同滚动
.看笔记详情如下。
按住
无保留
按住
指定游标在创建它的事务成功提交后可以继续使用。无保留
指定游标不能在创建它的事务之外使用。如果两者都没有无保留
也不按住
被指定,无保留
是默认值。
询问
关键词敏感的
,二进制
,不敏感
, 和滚动
可以以任何顺序出现。
# 笔记
普通游标以文本格式返回数据,与选择
会产生。这二进制
选项指定游标应以二进制格式返回数据。这减少了服务器和客户端的转换工作,但代价是程序员在处理依赖于平台的二进制数据格式方面付出了更多的努力。例如,如果查询从整数列返回值 1,您将得到一个字符串1
使用默认游标,而使用二进制游标,您将获得一个包含值的内部表示形式的 4 字节字段(以大端字节顺序)。
应谨慎使用二进制游标。许多应用程序,包括 psql,都没有准备好处理二进制游标并期望数据以文本格式返回。
# 笔记
当客户端应用程序使用“扩展查询”协议发出拿来
命令,绑定协议消息指定是否以文本或二进制格式检索数据。此选择会覆盖定义光标的方式。因此,在使用扩展查询协议时,二进制游标的概念已经过时——任何游标都可以被视为文本或二进制。
除非按住
指定时,该命令创建的游标只能在当前事务中使用。因此,宣布
没有按住
在事务块之外是无用的:游标只能存活到语句完成。因此,如果在事务块之外使用这样的命令,PostgreSQL 会报告错误。采用开始
和犯罪
(要么回滚
) 来定义一个事务块。
如果按住
指定并且创建该游标的事务成功提交,该游标可以继续被同一会话中的后续事务访问。(但如果创建事务被中止,游标将被移除。)按住
当显式时关闭关闭
对其发出命令,或会话结束。在当前的实现中,由持有的游标表示的行被复制到临时文件或内存区域中,以便它们保持可用于后续事务。
按住
当查询包括更新
或者分享
.
这滚动
定义将用于向后获取的游标时,应指定选项。这是 SQL 标准所要求的。但是,为了与早期版本兼容,PostgreSQL 将允许在没有滚动
,如果游标的查询计划足够简单,不需要额外的开销来支持它。但是,建议应用程序开发人员不要依赖从尚未创建的游标中使用反向获取滚动
.如果无滚动
指定,则在任何情况下都不允许向后提取。
当查询包括更新
或者分享
;所以滚动
在这种情况下可以不指定。
# 警告
如果可滚动游标调用任何 volatile 函数(请参阅第 38.7 节)。当重新获取先前提取的行时,可能会重新执行函数,可能会导致结果与第一次不同。最好指定无滚动
对于涉及 volatile 函数的查询。如果这不切实际,一种解决方法是声明游标按住滚动
并在从中读取任何行之前提交事务。这将强制游标的整个输出在临时存储中具体化,以便对每一行只执行一次易失性函数。
如果游标的查询包括更新
或者分享
, 然后返回的行在第一次获取时被锁定,与常规方法相同选择
带有这些选项的命令。此外,返回的行将是最新的版本。
# 警告
一般建议使用更新
如果光标打算与更新...当前在哪里
要么删除...当前在哪里
.使用更新
防止其他会话在获取它们的时间和更新它们的时间之间更改行。没有更新
, 随后当前位置
如果在创建游标后行已更改,则命令将无效。
另一个使用理由更新
是不是没有它,后续当前位置
如果游标查询不符合 SQL 标准的“简单可更新”规则(特别是游标必须只引用一个表并且不使用分组或订购方式
)。不能简单更新的游标可能有效,也可能无效,具体取决于计划选择细节;所以在最坏的情况下,应用程序可能在测试中工作,然后在生产中失败。如果更新
指定,游标保证是可更新的。
不使用的主要原因更新
和当前位置
是您是否需要光标可滚动,或者与并发更新隔离(即继续显示旧数据)。如果这是一项要求,请密切注意上面显示的警告。
SQL 标准仅对嵌入式 SQL 中的游标做出规定。PostgreSQL 服务器没有实现打开
游标语句;游标在声明时被认为是打开的。但是,ECPG,PostgreSQL 的嵌入式 SQL 预处理器,支持标准的 SQL 游标约定,包括那些涉及宣布
和打开
陈述。
您可以通过查询来查看所有可用的游标pg_cursors
系统视图。
# 例子
声明游标:
DECLARE liahona CURSOR FOR SELECT * FROM films;
看拿来有关游标使用的更多示例。
# 兼容性
SQL 标准只允许在嵌入式 SQL 和模块中使用游标。PostgreSQL 允许以交互方式使用游标。
根据 SQL 标准,对不敏感游标的更改由更新...当前在哪里
和删除...当前在哪里
语句在同一个游标中可见。PostgreSQL 将这些语句视为所有其他数据更改语句,因为它们不是可见的不敏感游标。
二进制游标是 PostgreSQL 扩展。