如果查询的结果集中有多行,可使用游标从中检索行。游标是 SQL 查询结果集的句柄或标识符以及该结果集中的位置。
有关游标的介绍,请参见使用游标。
使用 DECLARE 语句声明特定 SELECT 语句的游标。
使用 OPEN 语句打开游标。
使用 FETCH 语句从游标中一次检索一行。
一直读取行,直到返回 SQLE_NOTFOUND 警告。在变量 SQLCODE(在 SQL 通信区结构中定义)中返回错误和警告代码。
使用 CLOSE 语句关闭游标。
UltraLite 应用程序中的游标始终是使用 WITH HOLD 选项打开的。它们从不自动关闭。必须使用 CLOSE 语句显式关闭每个游标。
以下是游标用法的简单示例:
void print_employees( void ) { int status; EXEC SQL BEGIN DECLARE SECTION; char name[50]; char sex; char birthdate[15]; short int ind_birthdate; EXEC SQL END DECLARE SECTION; /* 1. Declare the cursor. */ EXEC SQL DECLARE C1 CURSOR FOR SELECT emp_fname || ' ' || emp_lname, sex, birth_date FROM "DBA".employee ORDER BY emp_fname, emp_lname; /* 2. Open the cursor. */ EXEC SQL OPEN C1; /* 3. Fetch each row from the cursor. */ for( ;; ) { EXEC SQL FETCH C1 INTO :name, :sex, :birthdate:ind_birthdate; if( SQLCODE == SQLE_NOTFOUND ) { break; /* no more rows */ } else if( SQLCODE < 0 ) { break; /* the FETCH caused an error */ } if( ind_birthdate < 0 ) { strcpy( birthdate, "UNKNOWN" ); } printf( "Name: %s Sex: %c Birthdate: %s\n",name, sex, birthdate ); } /* 4. Close the cursor. */ EXEC SQL CLOSE C1; } |
有关 FETCH 语句的详细信息,请参见FETCH 语句 [ESQL] [SP]。
游标定位在以下三个位置之一:
在一行上
在第一行之前
在最后一行之后
通过在定义游标的 SELECT 语句中包括 ORDER BY 子句,可以控制游标中行的顺序。如果忽略此子句,则行的顺序将是不可预知的。
如果没有显式定义顺序,则只能保证在返回 SQLE_NOTFOUND 前,重复读取会将结果集中的每一行返回一次且只返回一次。
打开游标时,它被定位在第一行之前。FETCH 语句将自动使游标的位置往下移。试图用 FETCH 读取最后一行之后的内容将导致 SQLE_NOTFOUND 错误,可以方便地将该错误用作行顺序处理已完成的信号。
还可将游标重新定位在相对查询结果开始或结尾的绝对位置,也可以相对于当前位置移动游标。UPDATE 和 DELETE 语句有特殊的定位 版本,可用于更新或删除游标当前位置处的行。如果游标位于第一行之前或最后一行之后,则返回 SQLE_NOTFOUND 错误。
要在使用显式定位时避免不可预知的结果,可在定义游标的 SELECT 语句中包括 ORDER BY 子句。
可以使用 PUT 语句将行插入到游标中。
在对某打开的游标所访问的任何信息进行更新之后,最好再次读取并显示这些行。如果游标用于显示单行,则 FETCH RELATIVE 0 将重新读取当前行。如果当前行已被删除,则从游标中读取下一行(或者如果没有其它行,则返回 SQLE_NOTFOUND)。
将临时表用于游标时,在关闭并重新打开游标之前,在基础表中插入的行根本不显示。对于大多数编程人员来说,如果不检查 SQL 预处理器生成的代码,或者如果对于在何种条件下使用临时表不十分了解,则很难确定 SELECT 语句中是否涉及临时表。通常可在 ORDER BY 子句中使用的列上建立索引来避免使用临时表。
有关临时表的详细信息,请参见在查询处理中使用工作表(使用 All-rows 优化目标)。
对非临时表的插入、更新和删除可能影响游标定位。因为 UltraLite 形成游标行时为一次一行(当不使用临时表时),新插入的行中的数据(或新删除的行中删除的数据)可能会影响后面的 FETCH 操作。在从单个表中选择(一部分)行的简单情况下,当插入或更新的行满足 SELECT 语句的选择标准时,该行将出现在游标的结果集中。类似地,以前提供给结果集中的新删除行将不再位于结果集中。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |