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)

 

OPEN 语句 [ESQL] [SP]

此语句用于打开以前声明的游标以访问数据库中的信息。

语法
OPEN cursor-name
[ USING { DESCRIPTOR sqlda-name | hostvar, ... } ]
[ WITH HOLD ]
[ ISOLATION LEVEL n ]
[ BLOCK n ]
cursor-name : identifier or hostvar
sqlda-name : identifier
参数
  • USING DESCRIPTOR 子句   USING DESCRIPTOR 子句仅用于嵌入式 SQL。它指定要绑定到已声明游标的 SELECT 语句中的占位符绑定变量的主机变量。

  • WITH HOLD 子句   缺省情况下,在当前事务(COMMIT 或 ROLLBACK)结束时会自动关闭所有游标。可选的 WITH HOLD 子句使游标对后面的事务保持打开。游标一直保持打开,直到当前连接结束或执行了显式 CLOSE 语句。连接终止时会自动关闭游标。

  • ISOLATION LEVEL 子句   ISOLATION LEVEL 子句允许以不同于 isolation_level 选项的当前设置的隔离级别打开此游标。此游标的所有操作都以指定的隔离级别执行,与该选项的设置无关。如果未指定此子句,则打开游标后,在游标打开的整段时间内,游标的隔离级别是 isolation_level 选项的值。请参见锁定的工作方式

    支持以下值:

    • 0
    • 1
    • 2
    • 3
    • snapshot
    • statement snapshot
    • readonly statement snapshot

    游标位于第一行之前(请参见在嵌入式 SQL 中使用游标在过程和触发器中使用游标)。

  • BLOCK 子句   此子句仅用于嵌入式 SQL。客户端应用程序一次可读取多行。这类读取称为块读取、预读或多行读取。BLOCK 子句可以减少预读的行数。在 OPEN 上指定 BLOCK 子句与在每个 FETCH 上指定 BLOCK 子句相同。请参见FETCH 语句 [ESQL] [SP]

注释

OPEN 语句打开指定的游标。该游标必须是以前声明的。

当游标位于 CALL 语句上时,OPEN 导致过程一直执行,直到遇到第一个结果集(不含 INTO 子句的 SELECT 语句)为止。如果该过程结束时未找到任何结果集,则会设置 SQLSTATE_PROCEDURE_COMPLETE 警告。

嵌入式 SQL 用法:在成功执行 OPEN 语句之后,SQLCA (SQLIOESTIMATE) 的 sqlerrd[3] 字段将被填入读取查询的所有行所需的输入/输出操作数的估计值。此外,SQLCA (SQLCOUNT) 的 sqlerrd[2] 字段将填入游标中的实际行数(大于或等于 0 的值)或其估计值(绝对值为估计值的负数)。如果数据库服务器不统计该值即可计算出行数,则该值就是实际行数。也可以将数据库配置为始终返回实际的行数(请参见row_counts 选项 [数据库]),但是这样做的开销很大。如果由标识符或字符串指定 cursor-name,则在 C 程序中,相应的 DECLARE CURSOR 必须出现在 OPEN 之前;如果由主机变量指定 cursor-name,则必须在 OPEN 语句之前执行 DECLARE CURSOR 语句。

权限

必须有 SELECT 语句中所有表的 SELECT 权限,或者有 CALL 语句中的过程的 EXECUTE 权限。

副作用

无。

另请参见
标准和兼容性
  • SQL/2003   嵌入式 SQL 使用是核心特性。过程使用是持久存储模块特性。

示例

以下示例说明如何在嵌入式 SQL 中使用 OPEN。

EXEC SQL OPEN employee_cursor;

EXEC SQL PREPARE emp_stat FROM
'SELECT empnum, empname FROM Employees WHERE name like ?';
EXEC SQL DECLARE employee_cursor CURSOR FOR emp_stat;
EXEC SQL OPEN employee_cursor USING :pattern;

下面的示例来自过程或触发器。

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