Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (E-O)

 

FOR 语句

此语句用于对游标中的每一行重复执行一次语句列表。

语法
[ 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