DECLARE

Name

DECLARE — 为访问表定义一个游标
DECLARE cursorname [ BINARY ] [ INSENSITIVE ] [ SCROLL ]
    CURSOR FOR query
    [ FOR { READ ONLY | UPDATE [ OF column [, ...] ] ]
  

输入

cursorname

将在随后 FETCH 操作中使用的游标名.

BINARY

令游标以二进制而不是文本格式获取数据.

INSENSITIVE

SQL92 SQL92 关键字, 表明从游标检索出来的数据不应该被其他进程或游标的更新动作影响. 因为在 Postgres 里,游标的操作总是发生在事务 里,所以总是符合上面描述.这个关键字没有作用.

SCROLL

SQL92 关键字,表明每个 FETCH 操作可以检索出多行数据. 因为在Postgres 在任何情况下都允许这样, 所以这个关键字没有作用.

query

一个 SQL 查询,它提供由游标控制的行. 请参考 SELECT 语句获取有关有效参数的详细信息.

READ ONLY

SQL92 关键字,表明游标将用于只读模式. 因为这是 Postgres 唯一的游标访问模式, 所以该关键字没有作用.

UPDATE

SQL92 关键字,表明游标将被用于更新表. 因为游标更新目前还不被 Postgres 支持, 所以这个关键字将产生一个错误信息.

column

将被更新的列.因为游标更新目前不被 Postgres 支持, 所以 UPDATE 子句将产生一个错误信息.

输出

SELECT

如果 SELECT 成功运行,返回此信息.

NOTICE: Closing pre-existing portal "cursorname"

如果在当前的事务块中此游标名称已经定义,返回此信息. 前面定义的游标被丢弃.

ERROR: DECLARE CURSOR may only be used in begin/end transaction blocks

如果一个游标没有在事务块内部定义,返回此信息.

描述

DECLARE 允许用户创建游标, 用于在一个大的查询里面检索少数几行数据. 使用 FETCH. ,游标可以既可以返回文本也可以返回二进制格式。

通常游标返回文本格式,要么是 ASCII 要么是某种由 Postgres 特定的后端决定的编码方式. 因为数据在系统内部是用二进制格式存储的, 系统必须对数据做一定转换以生成文本格式. 另外,文本格式一般都比对应的二进制格式占的存储空间大. 一旦格式转换回文本,客户应用需要将文本转换为二进制格式来操作. BINARY 游标给你返回内部二进制形态的数据。

作为例子,如果查询从一个整数列返回一个一, 在通常的游标里你将获得一个字符串'1'而如果是一个二进制查询, 你将得到一个 4-字节的等于ctrl-A('^A')的数值.

游标应该小心使用 BINARY. 一些用户应用如 psql 是不识别二进制游标的, 而且期望返回的数据是文本格式.

而且,字符串表示方式是与硬件体系无关的, 而二进制格式会因不同的硬件体系不同而不同,而且 Postgres 对二进制游标不做字节序解析或者其他格式转换 。 因此,如果你的客户机和服务器使用不同的格式 (如: "高位高字节" 和 "底位底字节").你可能就不会希望你的数据 以二进制格式返回.所以二进制游标将比文本略微快一点, 因为二进制在服务器和客户端的数据传输中有较少的转换.

小技巧: 如果你希望用 ASCII 显示数据, 将数据以 ASCII 模式访问将节省客户端的工作.

注意

游标只能在事务中使用.使用 BEGINCOMMITROLLBACK 定义一个事务块。

SQL92 中游标只能在嵌入 SQL (ESQL) 的应用中使用. Postgres 后端没有一个明确的 OPEN cursor 语句;一个游标被认为在定义时就已经打开了. 不过,Postgres嵌入的 SQL 预编译器, ecpg, 支持 SQL92 习惯,包括那些和 DECLARE 和 OPEN 相关的语句.

用法

定义一个游标:

DECLARE liahona CURSOR
    FOR SELECT * FROM films;
   

兼容性

SQL92

SQL92 只允许在嵌入的 SQL 中和模块中使用游标. Postgres 允许交互地使用游标. SQL92 允许嵌入或模块的游标更新数据库信息. 所有 Postgres 的游标都是只读的. BINARY 关键字是 Postgres 扩展.