对游标中的每一行重复执行一次语句列表。
[ statement-label : ] FOR for-loop-name AS cursor-name [ cursor-type ] CURSOR { FOR statement [ FOR { UPDATE cursor-concurrency | FOR READ ONLY } ] | USING variable-name } DO statement-list END FOR [ statement-label ]
cursor-type : NO SCROLL | DYNAMIC SCROLL | SCROLL | INSENSITIVE | SENSITIVE
cursor-concurrency : BY { VALUES | TIMESTAMP | LOCK }
variable-name : identifier
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 UPDATE 子句 FOR UPDATE 是缺省设置。对于不带 ORDER BY 子句的单表查询,或者在 ansi_update_constraints 选项设置为 Off 的情况下,游标的缺省设置为 FOR UPDATE。如果 ansi_update_constraints 选项设置为 Cursors 或 Strict,则停留在包含 ORDER BY 子句的查询上的游标的缺省设置为 READ ONLY。但可使用 FOR UPDATE 子句将游标显式标记为可更新。
FOR READ ONLY 子句 声明为 FOR READ ONLY 的游标不能在 UPDATE(定位)、DELETE(定位)或 PUT 语句中使用。由于允许通过 ORDER BY 子句或连接来更新游标的开销大,因此,停留在包含两个或更多表连接的查询上的游标为 READ ONLY,并且无法设置为可更新,除非 ansi_update_constraints 数据库选项为 Off。为响应指定 FOR UPDATE 的游标的任何请求,SQL Anywhere 提供了对值敏感的游标或敏感性未定型的游标。不敏感的游标或者敏感性未定型游标不能更新。
FOR 语句是一个控制语句,它允许对游标中的每一行执行一次 SQL 语句列表。FOR 语句等效于这样一个复合语句:游标有一个 DECLARE,游标结果集中的每一列有一个变量 DECLARE,后面跟一个循环,该循环将游标中的一行读入局部变量,并对游标中的每一行执行一次 statement-list。
有效的游标类型包括动态滚动(缺省)、滚动、非滚动、区分大小写以及不区分大小写。
每个局部变量的名称和数据类型都是从游标中使用的 statement 派生的。在 SELECT 语句中,数据类型为选择列表中表达式的数据类型。名称是选择列表项的别名(如果有),否则名称是列的名称。任何不是简单列引用的选择列表项都必须有别名。在 CALL 语句中,名称和数据类型取自过程定义中的 RESULT 子句。
LEAVE 语句可用于指示继续执行 END FOR 之后第一条语句。如果指定结尾 statement-label,则它必须与起始 statement-label 匹配。
FOR 语句创建的游标通过 WITH HOLD 隐式打开,因此在循环内执行的导致 COMMIT 的语句不会使游标关闭。
无。
无。
SQL/2008 FOR 语句是可选 SQL/2008 语言功能 P002 "计算完整性" 的一部分。与 DECLARE CURSOR 语句一样,cursor-concurrency 的使用是服务商扩充,游标敏感性和游标可滚动性选项的组合也是服务商扩充;请参见DECLARE CURSOR 语句 [ESQL] [SP]。FOR 语句的 USING 子句也是服务商扩充。
下面的代码段阐释了 FOR 循环的用法。
FOR names AS curs INSENSITIVE CURSOR FOR SELECT Surname FROM Employees DO CALL search_for_name( Surname ); END FOR; |
此代码段还阐释了 FOR 循环的用法。
BEGIN FOR names AS curs SCROLL CURSOR FOR SELECT EmployeeID, GivenName FROM Employees where EmployeeID < 130 FOR UPDATE BY VALUES DO MESSAGE 'emp: ' || GivenName; END FOR; END |
以下示例展示了在 myproc 过程内部使用的 FOR 循环,该循环会根据调用过程时指定的排序顺序(asc 表示升序,desc 表示降序)返回 Employees 表中的前 10 名雇员。
CALL sa_make_object( 'procedure', 'myproc' ) ; ALTER PROCEDURE myproc ( IN @order_by VARCHAR(20) DEFAULT NULL ) RESULT ( Surname person_name_t ) BEGIN DECLARE @sql LONG VARCHAR; DECLARE @msg LONG VARCHAR; DECLARE LOCAL TEMPORARY TABLE temp_names( surnames person_name_t ); SET @sql = 'SELECT TOP(10) * FROM Employees AS t ' ; CASE @order_by WHEN 'asc' THEN SET @sql = @sql || 'ORDER BY t.Surname ASC'; SET @msg = 'Sorted ascending by last name: '; WHEN 'desc' THEN SET @sql = @sql || 'ORDER BY t.Surname DESC'; SET @msg = 'Sorted ascending by last name: '; END CASE; FOR loop_name AS SCROLL CURSOR USING @sql DO INSERT INTO temp_names( surnames ) VALUES( Surname ); MESSAGE( @msg || Surname ) ; END FOR; SELECT * FROM temp_names; END ; |
如果调用 myproc 过程时指定了 asc(例如 CALL myproc( 'asc' );
),则返回以下结果:
Surname |
---|
Ahmed |
Barker |
Barletta |
Bertrand |
Bigelow |
Blaikie |
Braun |
Breault |
Bucceri |
Butterfield |
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |