此语句用于打开以前声明的游标以访问数据库中的信息。
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 选项的值。请参见锁定的工作方式。
支持以下值:
游标位于第一行之前(请参见在嵌入式 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 |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |