Collection Contents 上一页 下一页 PDF

ASA SQL 参考

SQL 语句

FETCH 语句 [ESQL] [SP]


说明 

此语句用于重新定位游标,然后从游标中获取数据。

语法 

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 语句最初将游标定位在第一行的前面。

游标定位问题 
插入 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-listhostvar-listsqlda-name 描述符数组的一对一关系。

权限 

游标必须是打开的,并且用户必须对游标声明所引用的表具有 SELECT 权限。

副作用 

无。

另请参见 
标准和兼容性 
示例 

以下是嵌入式 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;
END

Collection Contents 上一页 下一页 PDF