此语句用于声明游标。游标是处理查询结果的主要方法。
DECLARE cursor-name
[ UNIQUE ]
[ NO SCROLL
| DYNAMIC SCROLL
| SCROLL
| INSENSITIVE
| SENSITIVE
]
CURSOR FOR
{ select-statement
| statement-name
[ FOR { UPDATE [ cursor-concurrency ] | READ ONLY } ]
| call-statement }
DECLARE cursor-name
[ NO SCROLL
| DYNAMIC SCROLL
| SCROLL
| INSENSITIVE
| SENSITIVE
]
CURSOR FOR
{ select-statement
[ FOR { UPDATE [ cursor-concurrency ] | READ ONLY } ]
| call-statement
| USING variable-name }
cursor-name : identifier
statement-name : identifier | hostvar
variable-name : identifier
cursor-concurrency :
BY { VALUES | TIMESTAMP | LOCK }
UNIQUE 当游标声明为 UNIQUE 时,查询被强制返回唯一标识每行所需的所有列。这通常意味着确保返回主键或唯一性表约束中的所有列。任何需要的但是在查询中未指定的列都添加到结果集中。
UNIQUE 游标上完成的 DESCRIBE 在指示符变量中设置以下附加标志:
DT_KEY_COLUMN 此列是行键的一部分
DT_HIDDEN_COLUMN 此列被添加到查询中,因为唯一标识行需要它。
NO SCROLL 声明为 NO SCROLL 的游标仅限于使用 FETCH NEXT 和 FETCH RELATIVE 0 查找操作在结果集中前进。
因为一旦游标离开行,行就不能返回,所以游标没有敏感性限制。因此,当请求 NO SCROLL 游标时,Adaptive Server Anywhere 提供效率最高的游标,即敏感性未定型游标。
有关详细信息,请参见敏感性未定型游标。
DYNAMIC SCROLL DYNAMIC SCROLL 是缺省游标类型。DYNAMIC SCROLL 游标可以使用 FETCH 语句的所有形式。
当请求 DYNAMIC SCROLL 游标时,Adaptive Server Anywhere 提供敏感性未定型游标。当使用游标时,在效率和一致性之间总存在平衡问题。敏感性未定型游标以一致性为代价提供高效性能。
有关详细信息,请参见敏感性未定型游标。
SCROLL 声明为 SCROLL 的游标可以使用 FETCH 语句的所有形式。当请求 SCROLL 游标时,Adaptive Server Anywhere 提供对值敏感的游标。
有关详细信息,请参见对值敏感的游标。
Adaptive Server Anywhere 必须以保证结果集成员资格的方式执行对值敏感的游标。DYNAMIC SCROLL 游标的效率更高,应该使用它,除非要求 SCROLL 游标的一致行为。
INSENSITIVE 声明为 INSENSITIVE 的游标在打开时修复其成员资格;系统会使用所有原始行的副本创建一个临时表。INSENSITIVE 游标中的 FETCHING 看不到其它任何 INSERT、UPDATE 或 DELETE 语句的效果,也看不到另一个游标上的其它任何 PUT、UPDATE WHERE CURRENT、DELETE WHERE CURRENT 操作。它看不到同一游标上 PUT、UPDATE WHERE CURRENT、DELETE WHERE CURRENT 操作的效果。
有关详细信息,请参见不敏感游标。
SENSITIVE 声明为 SENSITIVE 的游标对结果集的成员资格或值的更改敏感。
有关详细信息,请参见敏感游标。
FOR statement-name 使用 PREPARE 语句为语句命名。只能为预准备 SELECT 或 CALL 声明游标。
FOR UPDATE | READ ONLY 声明为 FOR READ ONLY 的游标不能在 UPDATE(定位)或 DELETE(定位)操作中使用。FOR UPDATE 是缺省设置。
为响应指定 FOR UPDATE 的游标的请求,Adaptive Server Anywhere 提供对值敏感的游标或敏感性未定型的游标。不敏感的游标或者敏感性未定型游标不能更新。
USING variable-name 仅用于存储过程。此变量是包含游标 SELECT 语句的字符串。当处理 DECLARE 时,此变量必须可用,因此必须是以下之一:
过程的参数。例如,
create function get_row_count(in qry long varchar)
returns int
begin
declare crsr cursor using qry;
declare rowcnt int;
set rowcnt = 0;
open crsr;
lp: loop
fetch crsr;
if SQLCODE <> 0 then leave lp end if;
set rowcnt = rowcnt + 1;
end loop;
return rowcnt;
end此变量被赋值后,嵌套在另一个 BEGIN... END 内。例如,
create procedure get_table_name(
in id_value int, out tabname char(128)
)
begin
declare qry long varchar;
set qry = 'select table_name from SYS.SYSTABLE ' ||
'where table_id=' || string(id_value);
begin
declare crsr cursor using qry;
open crsr;
fetch crsr into tabname;
close crsr;
end
endDECLARE CURSOR 语句用 SELECT 语句或 CALL 语句的指定名称声明游标。
无。
无。
SQL/92 初级特性。
SQL/99 核心特性。
Sybase 受 Open Client/Open Server 支持。
下面的示例阐释如何在嵌入式 SQL 中声明滚动游标:
EXEC SQL DECLARE cur_employee SCROLL CURSOR FOR SELECT * FROM employee;
下面的示例阐释如何在嵌入式 SQL 中为预准备语句声明游标:
EXEC SQL PREPARE employee_statement FROM 'SELECT emp_lname FROM employee'; EXEC SQL DECLARE cur_employee CURSOR FOR employee_statement;
下面的示例阐释游标在存储过程中的使用:
BEGIN
DECLARE cur_employee CURSOR FOR
SELECT emp_lname
FROM employee;
DECLARE name CHAR(40);
OPEN cur_employee;
lp: LOOP
FETCH NEXT cur_employee INTO name;
IF SQLCODE <> 0 THEN LEAVE lp END IF;
...
END LOOP;
CLOSE cur_employee;
ENDSQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。