Synopsis
DECLARE
cursorname
[ BINARY ] [ INSENSITIVE ] [ SCROLL ]
CURSOR FOR
query
[ FOR { READ ONLY | UPDATE [ OF
column
[, ...] ] ]
输入
-
cursorname
-
将在随后 FETCH 操作中使用的游标名.
-
BINARY
-
令游标以二进制而不是文本格式获取数据.
-
INSENSITIVE
-
SQL92
SQL92 关键字,
表明从游标检索出来的数据不应该被其他进程或游标的更新动作影响.
因为在
PostgreSQL
里,游标的操作总是发生在事务
里,所以总是符合上面描述.这个关键字没有作用.
-
SCROLL
-
SQL92
关键字,表明每个 FETCH 操作可以检索出多行数据. 因为在
PostgreSQL
在任何情况下都允许这样,
所以这个关键字没有作用.
-
query
-
一个 SQL 查询,它提供由游标控制的行.
请参考 SELECT 语句获取有关有效参数的详细信息.
-
READ ONLY
-
SQL92
关键字,表明游标将用于只读模式.
因为这是
PostgreSQL
唯一的游标访问模式,
所以该关键字没有作用.
-
UPDATE
-
SQL92
关键字,表明游标将被用于更新表.
因为游标更新目前还不被
PostgreSQL
支持,
所以这个关键字将产生一个错误信息.
-
column
-
将被更新的列.因为游标更新目前不被
PostgreSQL
支持,
所以 UPDATE 子句将产生一个错误信息.
输出
-
SELECT
-
如果 SELECT 成功运行,返回此信息.
-
NOTICE: Closing pre-existing portal "
cursorname
"
-
如果在当前的事务块中此游标名称已经定义,返回此信息.
前面定义的游标被丢弃.
-
ERROR: DECLARE CURSOR may only be used in begin/end transaction blocks
-
如果一个游标没有在事务块内部定义,返回此信息.
描述
DECLARE
允许用户创建游标,
用于在一个大的查询里面检索少数几行数据.
使用
FETCH
.
,游标可以既可以返回文本也可以返回二进制格式。
通常游标返回文本格式,要么是 ASCII 要么是某种由
PostgreSQL
特定的后端决定的编码方式.
因为数据在系统内部是用二进制格式存储的,
系统必须对数据做一定转换以生成文本格式.
另外,文本格式一般都比对应的二进制格式占的存储空间大.
一旦格式转换回文本,客户应用需要将文本转换为二进制格式来操作.
BINARY 游标给你返回内部二进制形态的数据。
作为例子,如果查询从一个整数列返回一个一,
在通常的游标里你将获得一个字符串'1'而如果是一个二进制查询,
你将得到一个 4-字节的等于ctrl-A('^A')的数值.
游标应该小心使用 BINARY.
一些用户应用如
psql
是不识别二进制游标的,
而且期望返回的数据是文本格式.
而且,字符串表示方式是与硬件体系无关的,
而二进制格式会因不同的硬件体系不同而不同,而且
PostgreSQL
对二进制游标不做字节序解析或者其他格式转换
。
因此,如果你的客户机和服务器使用不同的格式
(如: "高位高字节" 和 "底位底字节").你可能就不会希望你的数据
以二进制格式返回.所以二进制游标将比文本略微快一点,
因为二进制在服务器和客户端的数据传输中有较少的转换.
小技巧:
如果你希望用 ASCII 显示数据,
将数据以 ASCII 模式访问将节省客户端的工作.
注意
游标只能在事务中使用.使用
BEGIN
,
COMMIT
和
ROLLBACK
定义一个事务块。
在
SQL92
中游标只能在嵌入
SQL
(
ESQL
) 的应用中使用.
PostgreSQL
后端没有一个明确的
OPEN cursor
语句;一个游标被认为在定义时就已经打开了.
不过,
PostgreSQL
嵌入的 SQL 预编译器,
ecpg
,
支持
SQL92
习惯,包括那些和 DECLARE 和 OPEN 相关的语句.
用法
定义一个游标:
DECLARE liahona CURSOR
FOR SELECT * FROM films;
兼容性
SQL92
SQL92
只允许在嵌入的
SQL
中和模块中使用游标.
PostgreSQL
允许交互地使用游标.
SQL92
允许嵌入或模块的游标更新数据库信息.
所有
PostgreSQL
的游标都是只读的.
BINARY 关键字是
PostgreSQL
扩展.
|