第二章 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
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
相关文章推荐
- 第二章 SQL命令参考-CREATE VIEW
- 第二章 SQL命令参考-VALUES
- 第二章 SQL命令参考-BEGIN
- 第二章 SQL命令参考-INSERT
- 第二章 SQL命令参考-RELEASE SAVEPOINT
- 第二章 SQL命令参考-RESET
- 第二章 SQL命令参考-ANALYZE
- 第二章 SQL命令参考-CREATE TABLESPACE
- 第二章 SQL命令参考-PREPARE
- 第二章 SQL命令参考-REASSIGN OWNED
- 第二章 SQL命令参考-LOAD
- 第二章 SQL命令参考-CREATE TABLE AS
- 第二章 SQL命令参考-ROLLBACK TO SAVEPOINT
- 第二章 SQL命令参考- SELECT INTO
- 第二章 SQL命令参考-DELETE
- 第二章 SQL命令参考-ALTER EXTERNAL TABLE
- 第二章 SQL命令参考-SET ROLE
- 第二章 SQL参考命令-CLUSTER
- 第二章 SQL命令参考-CREATE TYPE
- 第二章 SQL命令参考- VACUUM