打开以前声明的游标以访问数据库中的信息。
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 特权,或者具有相应的 SELECT 系统特权(如 SELECT ANY TABLE)。
当游标位于 CALL 语句上时,您必须是过程的所有者或具有过程的 EXECUTE 特权,或者具有 EXECUTE ANY PROCEDURE 系统特权。
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 GROUPO.Employees WHERE name like ?'; EXEC SQL DECLARE employee_cursor CURSOR FOR emp_stat; EXEC SQL OPEN employee_cursor USING :pattern; |
以下代码段示例显示过程或触发器中的 OPEN 语句。
BEGIN DECLARE cur_employee CURSOR FOR SELECT Surname FROM GROUPO.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讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |