此语句用于声明游标。游标是处理查询结果的主要方法。
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 } ] | FOR 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 游标时,SQL Anywhere 提供效率最高的游标,即敏感性未定型游标。请参见敏感性未定型游标。
DYNAMIC SCROLL 子句 DYNAMIC SCROLL 是缺省游标类型。DYNAMIC SCROLL 游标可以使用 FETCH 语句的所有形式。
当请求 DYNAMIC SCROLL 游标时,SQL Anywhere 提供敏感性未定型游标。当使用游标时,总是存在效率与一致性的平衡问题。敏感性未定型游标以一致性为代价提供高效性能。请参见敏感性未定型游标。
SCROLL 子句 声明了 SCROLL 的游标可以使用 FETCH 语句的所有形式。当请求 SCROLL 游标时,SQL Anywhere 提供对值敏感的游标。请参见对值敏感的游标。
SQL 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 是缺省设置。
对于不带 ORDER BY 子句的单表查询,或者在 ansi_update_constraints 选项设置为 Off 的情况下,游标的缺省设置为 FOR UPDATE。如果 ansi_update_constraints 选项设置为 Cursors 或 Strict,则停留在包含 ORDER BY 子句的查询上的游标的缺省设置为 READ ONLY。但可使用 FOR UPDATE 子句将游标显式标记为可更新。由于允许通过 ORDER BY 子句或连接来更新游标的开销大,因此,停留在包含两个或更多表连接的查询上的游标为 READ ONLY,并且无法设置为可更新。
为响应指定 FOR UPDATE 的游标的任何请求,SQL Anywhere 提供了对值敏感的游标或敏感性未定型的游标。不敏感的游标或者敏感性未定型游标不能更新。
USING variable-name 仅限于在存储过程中使用。此变量是包含游标 SELECT 语句的字符串。当处理 DECLARE 时,此变量必须可用,因此必须是以下项之一:
过程的参数。例如,
CREATE FUNCTION GetRowCount( 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.SYSTAB ' || 'WHERE table_id=' || string(id_value); BEGIN DECLARE crsr CURSOR USING qry; OPEN crsr; FETCH crsr INTO tabname; CLOSE crsr; END END; |
BY VALUES | TIMESTAMP | LOCK 子句 在嵌入式 SQL 中,可通过在 SELECT 语句本身或游标声明中包括语法来设置并发说明。通过带有 DECLARE CURSOR 或 FOR 语句的选项,或特定编程接口中的并发设置 API,可以在游标级选择保守或优化的并发。如果语句可更新,并且游标未指定特定并发控制机制,则将使用语句的说明。语法如下:
FOR UPDATE BY LOCK 子句 数据库服务器在结果集的 FETCHed(已读取)行上获得意图行锁。这些锁是长期锁,会一直保留到事务 COMMIT 或 ROLLBACK 执行。
FOR UPDATE BY { VALUES | TIMESTAMP } 数据库服务器利用了由键集决定的游标,这样,如果在滚动结果集过程中修改或删除了行,则会通过该游标通知应用程序。
DECLARE CURSOR 语句用 SELECT 语句或 CALL 语句的指定名称声明游标。在 Watcom-SQL 过程、触发器或批处理中,DECLARE CURSOR 语句必须与其它声明一同出现,且紧跟在 BEGIN 关键字之后。此外,游标名必须唯一。
如果某游标是在复合语句内声明的,则它仅在该复合语句的持续时间内存在(无论它是在 Watcom-SQL 还是在 Transact-SQL 复合语句中声明)。
无。
无。
SQL/2003 核心特性。
下面的示例说明了如何在嵌入式 SQL 中声明滚动游标:
EXEC SQL DECLARE cur_employee SCROLL CURSOR FOR SELECT * FROM Employees; |
以下示例说明了如何在嵌入式 SQL 中为预准备语句声明游标:
EXEC SQL PREPARE employee_statement FROM 'SELECT Surname FROM Employees'; EXEC SQL DECLARE cur_employee CURSOR FOR employee_statement; |
以下示例说明了如何在存储过程中使用游标:
BEGIN DECLARE cur_employee CURSOR FOR SELECT Surname FROM Employees; 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; END |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |