此语句用于对游标中的每一行重复执行一次语句列表。
[ 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 子句将游标显式标记为可更新。
READ ONLY 子句 声明为 FOR READ ONLY 的游标不能在 UPDATE(定位)或 DELETE(定位)操作中使用。由于允许通过 ORDER BY 子句或连接来更新游标的开销大,因此,停留在包含两个或更多表连接的查询上的游标为 READ ONLY,并且无法设置为可更新。为响应指定 FOR UPDATE 的游标的任何请求,SQL Anywhere 提供了对值敏感的游标或敏感性未定型的游标。不敏感的游标或者敏感性未定型游标不能更新。
FOR 语句是一个控制语句,它允许对游标中的每一行执行一次 SQL 语句列表。FOR 语句等效于这样一个复合语句:游标有一个 DECLARE,游标结果集中的每一列有一个变量 DECLARE,后面跟一个循环,该循环将游标中的一行读入局部变量,并对游标中的每一行执行一次 statement-list。
有效的游标类型包括动态滚动(缺省)、滚动、非滚动、区分大小写以及不区分大小写。
每个局部变量的名称和数据类型都是从游标中使用的 statement 派生的。在 SELECT 语句中,数据类型为选择列表中表达式的数据类型。名称是选择列表项的别名(如果有),否则名称是列的名称。任何不是简单列引用的选择列表项都必须有别名。在 CALL 语句中,名称和数据类型取自过程定义中的 RESULT 子句。
LEAVE 语句可用于指示继续执行 END FOR 之后第一条语句。如果指定结尾 statement-label,则它必须与起始 statement-label 匹配。
无。
无。
SQL/2003 持久存储模块特性。
下面的代码段阐释了 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 |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |