您的位置:首页 > 数据库

第二章 SQL命令参考-DECLARE

2017-10-23 23:12 253 查看
DECLARE
Defines acursor.
概要
DECLARE name [BINARY] [INSENSITIVE] [NO SCROLL]CURSOR [{WITH | WITHOUT} HOLD]
FOR query [FOR READ ONLY]
描述
DECLARE允许用户创建光标,可以用于从较大的查询中一次检索少量的行。游标可以使用FETCH以文本或二进制格式返回数据。

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

例如,如果一个查询从一个整数列返回一个值,那么您将获得一个带有默认游标的字符串1,而使用二进制游标,您将获得一个包含值内部表示的4字节字段(in大端字节顺序)。

应仔细使用二进制光标。许多应用程序(包括psql)并不准备处理二进制游标,并希望以文本格式返回数据。

Note:
当客户端应用程序使用的'扩展查询'协议发出FETCH命令,绑定协议消息指定的数据是否在文本或二进制格式,以进行检索。这个选择覆盖游标的定义方式。使用扩展查询协议时,一个二进制光标这样的概念,因此是过时的 。任何游标都可以作为文本或二进制处理。
可以在UPDATE或DELETE命令的WHERE CURRENT OF子句中指定游标来更新或删除表数据。
parameter
name

要创建的光标的名称。
BINARY
导致光标以二进制文本格式返回数据。
INSENSITIVE
表示从光标检索的数据不受表更新的影响游标位于光标所在位置。在Greenplum数据库中,所有游标都是不敏感的。这个关键词目前没有任何效果,并且与SQL标准兼容。

NO SCROLL
游标不能用于以非顺序的方式检索行。这是Greenplum数据引擎的默认行为,因为滚动游标(滚动)不受支持。
WITH HOLD WITHOUT HOLD
WITH HOLD指定在创建它的事务成功提交之后,游标可能会继续使用。 WITHOUT HOLD指定光标不能在创建它的事务之外使用。 没有HOLD是默认值。

当查询包含FOR UPDATE或FOR SHARE子句时,不能指定WITH HOLD。
query

一个SELECT或VALUES命令,它将提供由游标返回的行。

如果游标在UPDATE或DELETE命令的WHERE CURRENTOF子句中使用SELECT命令必须满足以下条件:

•    无法引用视图或外部表。
•  仅引用一个表。
该表必须是可更新的。例如,以下是不可更新的:table functions, set-returningfunctions, append-only tables, columnar tables.
•    不能包含以下任何内容:
•    A groupingclause
•    A setoperation such as union all or union distinct<
b047
/p>
•    A sortingclause
•    A windowingclause
•    A join or aself-join
在SELECT命令中指定FOR UPDATE子句可以防止其他会话在获取时间和更新时间之间更改行。

如果没有FOR UPDATE子句,那么随着使用WHERE CURRENTOF子句的UPDATE或DELETE命令,如果自创建游标以来,该行已更改,则不起作用。
Note: 在SELECT命令中指定FOR UPDATE子句将锁定整个表,而不仅仅是选定的行。
               Notes

除非指定了WITH HOLD,否则此命令创建的游标只能在当前事务中使用。因此,没有WITH HOLD的DECLARE在事务块之外是无用的:光标只能生存到语句的完成。因此,如果在事务块外使用此命令,Greenplum数据库将报告错误。使用BEGIN,COMMIT和ROLLBACK来定义事务块。

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

如果在事务中使用DECLARE命令创建游标,则在使用cLosE命令关闭游标之前,不能在事务中使用SET命令。

Greenplum Database目前不支持滚动光标。您只能使用FETCH向前移动光标位置,而不是向后移动。

DECLARE ...适用于优化后的表格不支持FoRUPDATE。

您可以通过查询pg_cursors系统视图来查看所有可用的游标。
示例
Declare acursor:
DECLAREmycursor CURSOR FOR SELECT * FROM mytable;
兼容性
SQL标准只允许在嵌入式SQL和模块中使用游标。 Greenplum数据库允许光标交互使用。

Greenplum数据库不会为游标实现OPEN语句。 光标在声明时被认为是打开的。

SQL标准允许光标向前和向后移动。 所有Greenplum数据库游标仅向前移动(不可滚动)。

二进制游标是Greenplum数据库扩展。
相关参考
CLOSE, DELETE, FETCH,
MOVE, SELECT, UPDATE
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息