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 语句 (A-D)

 

DECLARE CURSOR 语句 [ESQL] [SP]

此语句用于声明游标。游标是处理查询结果的主要方法。

语法 1 [ESQL]
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 }
语法 2 [SP]
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