此语句用于重新定位游标,然后从游标中获取数据。
FETCH cursor-position cursor-name
[ INTO { hostvar-list | variable-list }
| USING DESCRIPTOR sqlda-name ]
[ PURGE ]
[ BLOCK n ]
[ FOR UPDATE ]
[ ARRAY fetch-count ]
INTO variable-list [ FOR UPDATE ]
cursor-position :
NEXT | PRIOR | FIRST | LAST
| { ABSOLUTE | RELATIVE } row-count
row-count : number 或 hostvar
cursor-name : identifier 或 hostvar
hostvar-list : 可能包含指示符变量
variable-list : 存储过程变量
sqlda-name : identifier
fetch-count : integer 或 hostvar
INTO INTO 子句是可选的。如果未指定该子句,则 FETCH 语句仅定位游标。 hostvar-list 仅供嵌入式 SQL 使用。
cursor position 一个可选定位参数,它允许在读取行之前移动游标。如果读取操作中包括定位参数,而位置在允许的游标位置外,则会发出 SQLE_NOTFOUND 警告,并且 SQLCOUNT 字段指示从有效位置的偏移量。
OPEN 语句最初将游标定位在第一行的前面。
NEXT NEXT 是缺省定位参数,它使游标在读取行之前向前移动一行。
PRIOR 使游标在读取前向后移动一行。
RELATIVE RELATIVE 定位用于在读取前将游标沿任一方向移动指定的行数。正数表示向前移动,负数表示向后移动。因此,NEXT 等效于 RELATIVE 1,PRIOR 等效于 RELATIVE -1。RELATIVE 0 检索的行与该游标的上一读取语句检索的行相同。
ABSOLUTE ABSOLUTE 定位参数用于转到具体某行。0 表示第一行前面的位置(请参见在过程和触发器中使用游标)。
1 表示第一行,依此类推。负数用于指定游标末尾的绝对位置。-1 表示游标的最后一行。
FIRST ABSOLUTE 1 的缩写形式。
LAST ABSOLUTE -1 的缩写形式。
游标定位问题插入 DYNAMIC SCROLL 游标并对其进行某些更新会导致与游标定位有关的问题。除非 SELECT 语句中有 ORDER BY 子句,否则数据库服务器不将插入的行放在游标内可预知的位置。在有些情况下,插入的行要等到关闭并再次打开游标后才会出现。如果在打开游标时必须创建一个临时表,则会发生这种情况(有关说明,请参见在查询处理中使用工作表)。 UPDATE 语句可能导致行在游标中移动。如果游标有使用现有索引的 ORDER BY(未创建临时表),则会发生这种情况。 |
BLOCK 子句 客户端应用程序一次可读取多行。这类读取称为块读取、预读或多行读取。第一个读取导致从服务器发回若干行。客户端将这些行放入缓冲区,后面的读取从这些缓冲区中检索,而不对服务器发出新的请求。
BLOCK 子句仅供嵌入式 SQL 使用。它提示客户端和服务器:应用程序可读取多少行。特殊值 0 表示请求将发送到服务器,并且只返回一行(没有行块)。BLOCK 子句会减少对 BLOCK 值的下一次预读中包含的行数。要增加预读的行数,请使用 PrefetchRows 连接参数。
如果未指定 BLOCK 子句,则使用 OPEN 上指定的值。有关详细信息,请参见 OPEN 语句 [ESQL] [SP]。
FETCH RELATIVE 0 总是重新读取行。
PURGE 子句 PURGE 子句仅供嵌入式 SQL 使用。它使客户端刷新其所有行的缓冲区,然后向服务器发送读取请求。请注意,读取请求可能返回行块。
FOR UPDATE 子句 FOR UPDATE 子句指示读取的行随后将由 UPDATE WHERE CURRENT OF CURSOR 语句更新。该子句使数据库服务器在行上放置一个写锁。该锁一直保持到当前事务结束时为止。请参见锁定的工作方式。
ARRAY 子句 ARRAY 子句仅供嵌入式 SQL 使用。该子句允许所谓的大范围读取,即同时检索多行并会提高性能。
若要在嵌入式 SQL 中使用大范围读取,请按如下所示在代码中包括读取语句:
EXEC SQL FETCH . . . ARRAY nnn
其中 ARRAY nnn 是 FETCH 语句的最后一项。读取计数 nnn 可以是一个主机变量。SQLDA 必须包含 nnn * (columns per row) 个变量。第一行放在 SQLDA 变量 0 到 (columns per row)-1 中,依此类推。
有关使用宽读取的详细示例,请参见一次读取多个行一节。
FETCH 语句从指定的游标中检索一行。游标在此前必须已打开。
嵌入式 SQL 使用 DECLARE CURSOR 语句在 C 源代码中必须出现在 FETCH 语句的前面,而 OPEN 语句必须在 FETCH 语句之前执行。如果主机变量用于游标名,则实际上是 DECLARE 语句生成代码,因此 DECLARE 语句必须在 FETCH 语句之前执行。
服务器在 SQLCOUNT 中返回读取的记录数,并且总是返回大于零的 SQLCOUNT,除非出现错误或警告。如果在 SQLCOUNT 为零时没有出现错误情况,则表示读取了一个有效行。
如果在读取时返回 SQLSTATE_NOTFOUND 警告,则 SQLCA (SQLCOUNT) 的 sqlerrd[2] 字段中包含所尝试的读取超出所允许的游标位置的行数。如果未找到行但位置有效,则值为 0。例如,当定位在游标的最后一行时执行 FETCH RELATIVE 1。如果所尝试的读取超出了游标的末尾,则为正值;如果所尝试的读取位于游标开头的前面,则为负值。
成功执行了读取语句后,SQLCA (SQLIOCOUNT) 的 sqlerrd[1] 字段递增,增量为执行读取所需的输入/输出操作数。该字段实际上在每个数据库语句执行时都递增。
单行读取 SELECT 语句结果中的一行被放入变量表的变量中。选择表和主机变量表之间是一对一的对应关系。
多行读取 SELECT 语句返回的结果中的一行或多行放在 variable-list 的变量中或 sqlda-name 描述的程序数据区中。在上述任何一种情况下,对应关系都是从 select-list 到 hostvar-list 或 sqlda-name 描述符数组的一对一关系。
游标必须是打开的,并且用户必须对游标声明所引用的表具有 SELECT 权限。
无。
SQL/92 初级特性。在过程中使用的是持久存储模块特性。
SQL/99 核心特性。在过程中使用的是持久存储模块特性。
Sybase 受 Adaptive Server Enterprise 支持。
以下是嵌入式 SQL 的示例。
EXEC SQL DECLARE cur_employee CURSOR FOR SELECT emp_id, emp_lname FROM employee; EXEC SQL OPEN cur_employee; EXEC SQL FETCH cur_employee INTO :emp_number, :emp_name:indicator;
以下是过程示例:
BEGIN
DECLARE cur_employee CURSOR FOR
SELECT emp_lname
FROM employee;
DECLARE name CHAR(40);
OPEN cur_employee;
LOOP
FETCH NEXT cur_employee into name;
...
END LOOP
CLOSE cur_employee;
ENDSQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。