对游标中的每一行重复执行一次语句列表。
[ statement-label : ] FOR for-loop-name AS cursor-name [ cursor-type ] CURSOR { FOR statement [ FOR { UPDATE [ cursor-concurrency ] | 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 的游标会在其生存期内固定其值和成员资格。打开游标后,SELECT 语句的结果集将被实例化。INSENSITIVE 游标的 FETCHING 看不到任何连接(包括打开该游标的连接)的任何其它 INSERT、UPDATE、MERGE、PUT 或 DELETE 语句的效果。
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 语句中,数据类型为 SELECT 列表中表达式的数据类型。名称是 SELECT 列表项的别名(如果有),否则名称是列的名称。任何不是简单列引用的 SELECT 列表项都必须有别名。在 CALL 语句中,名称和数据类型取自过程定义中的 RESULT 子句。
LEAVE 语句可用于指示继续执行 END FOR 之后第一条语句。如果指定结尾 statement-label,则它必须与起始 statement-label 匹配。
FOR 语句创建的游标通过 WITH HOLD 隐式打开,因此在循环内执行的导致 COMMIT 的语句不会使游标关闭。
如果不指定 cursor-name,cursor-type 将用作 cursor-name。
无。
无。
SQL/2008 FOR 语句是可选 SQL/2008 语言功能 P002 "计算完整性" 的一部分。FOR 语句的 USING 子句是服务商扩充。与 DECLARE CURSOR 语句一样,cursor-concurrency 的使用是服务商扩充,游标敏感性和游标可滚动性选项的组合也是服务商扩充。
下面的代码段阐释了 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 curs 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讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |