DECLARE
DECLARE — 定义一个游标
大纲
DECLAREname[ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ] CURSOR [ { WITH | WITHOUT } HOLD ] FORquery[ FOR { READ ONLY | UPDATE [ OFcolumn[, ...] ] } ]
描述
DECLARE允许用户创建游标,游标可用于从较大的查询中一次取出少量行。游标可以使用FETCH以文本或二进制格式返回数据。
普通游标以文本格式返回数据,就像SELECT所产生的结果一样。由于数据在内部是以二进制格式存储的,系统必须做一次转换才能产生文本格式。而信息以文本形式返回后,客户端应用又可能需要把它转换回二进制格式才能处理。此外,文本格式的数据通常比二进制格式占用的空间更大。二进制游标以二进制表示返回数据,处理起来可能更方便。不过,如果你本来就打算把数据显示为文本,那么以文本形式检索会省去客户端的一些工作量。
举例来说,如果某个查询从一个整型列返回值 1,那么默认游标会返回字符串
1,而二进制游标则会返回一个 4 字节字段,其中包含该值的内部表示(采用大端字节序)。
应谨慎使用二进制游标。许多应用程序(包括 psql)都没有准备好处理二进制游标,而是期望返回的数据为文本格式。
注意
当客户端应用使用“扩展查询”协议发出FETCH命令时,Bind 协议消息会指定数据应以文本格式还是二进制格式提取。这一选择会覆盖定义游标时所指定的方式。因此,在使用扩展查询协议时,二进制游标这一概念实际上已经过时了
— 任何游标都可以按文本或二进制方式处理。
参数
name要创建的游标名称。它必须与该会话中任何其他活动游标的名称不同。
BINARY使游标以二进制格式而不是文本格式返回数据。
INSENSITIVE表示从游标取出的数据不应受到游标存在期间对其底层表所做更新的影响。在PostgreSQL中,所有游标都是不敏感的;该关键字目前没有任何效果,只是为兼容 SQL 标准而存在。
SCROLLNO SCROLLSCROLL指定游标可用于以非顺序方式(例如向后)取出行。根据查询执行计划的复杂程度,指定SCROLL可能会给查询执行带来性能开销。NO SCROLL指定游标不能以非顺序方式取出行。默认情况下只在某些情形下允许滚动,这与显式指定SCROLL并不相同。详见下文注解。WITH HOLDWITHOUT HOLDWITH HOLD指定在创建该游标的事务成功提交后,仍可继续使用该游标。WITHOUT HOLD指定该游标不能在创建它的事务之外使用。如果既未指定WITHOUT HOLD也未指定WITH HOLD,默认值是WITHOUT HOLD。query一个将为游标提供要返回的行的
SELECT命令。有关有效查询的更多信息,请参阅SELECT。FOR READ ONLYFOR UPDATEFOR READ ONLY表示该游标将以只读方式使用。FOR UPDATE表示该游标将用于更新表。由于 PostgreSQL目前不支持游标更新,指定FOR UPDATE会导致一条错误消息,而指定FOR READ ONLY则没有任何效果。column将被游标更新的列。由于PostgreSQL目前不支持游标更新,
FOR UPDATE子句会引发一条错误消息。
关键字BINARY、INSENSITIVE和SCROLL可以按任意顺序出现。
注解
除非指定了WITH HOLD,否则该命令创建的游标只能在当前事务中使用。因此,DECLARE若不带WITH HOLD,在事务块之外就毫无用处:游标只能存活到该语句执行完成。所以,如果在事务块之外使用这种命令,PostgreSQL会报错。可使用BEGIN、COMMIT和ROLLBACK来定义事务块。
如果指定了WITH HOLD,且创建游标的事务成功提交,那么在同一会话中的后续事务里仍可继续访问该游标。(但如果创建事务被中止,游标会被移除。)使用WITH HOLD创建的游标会在对其发出显式CLOSE命令时关闭,或在会话结束时关闭。在当前实现中,这种游标所表示的行会被复制到临时文件或内存区域中,以便它们在后续事务中仍然可用。
在定义将用于向后取出行的游标时,应指定SCROLL选项。这是 SQL 标准所要求的。不过,为了兼容早期版本,如果游标的查询计划足够简单,以致支持向后取出不需要额外开销,PostgreSQL也允许在未指定SCROLL的情况下向后取出行。不过,建议应用开发者不要依赖于从未用SCROLL创建的游标中向后取出行。如果指定了NO SCROLL,那么无论如何都不允许向后取出行。
SQL 标准只为嵌入式SQL中的游标作出规定。PostgreSQL服务器没有为游标实现OPEN语句;游标在声明时即被视为打开。不过,ECPG是PostgreSQL的嵌入式 SQL 预处理器,它支持标准 SQL 的游标约定,包括涉及DECLARE和OPEN语句的那些约定。
兼容性
SQL 标准只允许在嵌入式SQL和模块中使用游标。PostgreSQL允许以交互方式使用游标。
SQL 标准允许游标更新表数据。所有 PostgreSQL游标都是只读的。
二进制游标是PostgreSQL的一种扩展。