打开以前声明的游标以访问数据库中的信息。
OPEN cursor-name [ USING { DESCRIPTOR sqlda-name | hostvar, ... } ] [ WITH HOLD ] [ ISOLATION LEVEL isolation-level ] [ BLOCK n ]
OPEN cursor-name [ WITH HOLD ] [ ISOLATION LEVEL isolation-level ]
cursor-name : identifier | hostvar
sqlda-name : identifier
isolation-level : 0 | 1 | 2 | 3 | SNAPSHOT | STATEMENT SNAPSHOT | READONLY STATEMENT SNAPSHOT
USING DESCRIPTOR 子句 USING DESCRIPTOR 子句仅用于嵌入式 SQL。它指定要绑定到已声明游标的 SELECT 语句中的占位符绑定变量的主机变量。
OPEN...USING 不能在存储过程中使用。
WITH HOLD 子句 缺省情况下,在当前事务(COMMIT 或 ROLLBACK)结束时会自动关闭所有游标。可选的 WITH HOLD 子句使游标对后面的事务保持打开。游标一直保持打开,直到当前连接结束或执行了显式 CLOSE 语句。连接终止时会自动关闭游标。
COMMIT 或 ROLLBACK 时,连接所持有的所有长期行锁都会被释放,其中包括构成 WITH HOLD 游标结果集的那些行。但是,以隔离级别 1、2 和 3 获取到的游标稳定性锁将在游标的生命周期内保留,仅当游标关闭或连接终止时才被释放。
执行完 ROLLBACK 语句后,WITH HOLD 游标中的内容和定位是不可预知的,并且无法得到保证。您可以使用 ansi_close_cursors_on_rollback 选项来控制 ROLLBACK 语句是否将自动关闭 WITH HOLD 游标。
ISOLATION LEVEL 子句 ISOLATION LEVEL 子句允许以不同于 isolation_level 选项的当前设置的隔离级别打开此游标。此游标的所有操作都以指定的隔离级别执行,与该选项的设置无关。如果未指定此子句,则打开游标后,在游标打开的整段时间内,游标的隔离级别是 isolation_level 选项的值。
支持以下值:
游标位于第一行之前。
BLOCK 子句 此子句仅用于嵌入式 SQL。客户端应用程序一次可读取多行。这类读取称为块读取、预读或多行读取。BLOCK 子句可以减少预读的行数。在 OPEN 上指定 BLOCK 子句与在每个 FETCH 上指定 BLOCK 子句相同。
OPEN 语句打开指定的游标。该游标必须是以前声明的。
如果游标类型与游标基础语句的特性不匹配,OPEN 语句可能会返回 SQL 警告。
当游标位于 CALL 语句上时,OPEN 导致过程一直执行,直到遇到第一个结果集(不含 INTO 子句的 SELECT 语句)为止。如果该过程结束时未找到任何结果集,则会设置 SQLSTATE_PROCEDURE_COMPLETE 警告。
嵌入式 SQL 用法 在成功执行 OPEN 语句之后,SQLCA (SQLIOESTIMATE) 的 sqlerrd[3] 字段将被填入读取查询的所有行所需的输入/输出操作数的估计值。此外,SQLCA (SQLCOUNT) 的 sqlerrd[2] 字段将填入游标中的实际行数(大于或等于 0 的值)或其估计值(绝对值为估计值的负数)。如果数据库服务器不统计该值即可计算出行数,则该值就是实际行数。也可以将数据库配置为始终返回实际的行数,但是这样做的开销很大。
如果由标识符或字符串指定 cursor-name,则在 C 程序中,相应的 DECLARE CURSOR 语句必须出现在 OPEN 之前;如果由主机变量指定 cursor-name,则必须在 OPEN 语句之前执行 DECLARE CURSOR 语句。
必须有 SELECT 语句中所有表的 SELECT 权限,或者有 CALL 语句中的过程的 EXECUTE 权限。
OPEN 会对 INSENSITIVE 光标的结果集进行完全实例化。
如果启用访问计划高速缓存,可能会取消一些将在 OPEN 时返回到应用程序的 SQL 警告。取消的警告包括指示以下内容的警告:光标类型已更改,基础查询为非确定性,或者语句中嵌入的一个或多个文字常量已发生字符串截断。
SQL/2008 在嵌入式 SQL 中使用 OPEN 语句是可选 SQL 语言功能 B031 "基本动态 SQL" 的一部分。在存储过程中使用 OPEN 语句是 SQL/2008 的核心功能。ISOLATION LEVEL 和 BLOCK 子句是服务商扩充,用于在 CALL 语句中 "打开" 游标。在 SQL/2008 标准中,WITH HOLD 被指定为 DECLARE CURSOR 语句的一部分,而不是被指定为 OPEN 语句的一部分。
在 SQLCA 中设置特定值是服务商扩充。
Transact-SQL Adaptive Server Enterprise 支持 OPEN 语句。Adaptive Server Enterprise 不支持 ISOLATION LEVEL、BLOCK 和 WITH HOLD 子句。
以下示例说明如何在嵌入式 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 |
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |