Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 编程 » SQL Anywhere 数据访问 API » SQL Anywhere 嵌入式 SQL » 读取数据

 

在嵌入式 SQL 中使用游标

游标用于从其结果集中具有多个行的查询中检索行。游标是 SQL 查询的句柄或标识符,也是结果集中的一个位置。

有关游标的介绍,请参见使用游标

♦  在嵌入式 SQL 中管理游标
  1. 使用 DECLARE 语句声明特定 SELECT 语句的游标。

  2. 使用 OPEN 语句打开游标。

  3. 使用 FETCH 语句一次一行地从游标中检索结果。

  4. 读取行,直到返回 [未找到行] 警告。

    在 SQLCA 结构中返回错误和警告。请参见SQL 通信区域 (SQLCA)

  5. 使用 CLOSE 语句关闭游标。

缺省情况下,在事务(COMMIT 或 ROLLBACK 上)的结尾会自动关闭游标。用 WITH HOLD 子句打开的游标对于后续事务保持打开状态,直到它们被显式关闭。

以下是游标用法的简单示例:

void print_employees( void )
{
  EXEC SQL BEGIN DECLARE SECTION;
  char name[50];
  char Sex;
  char birthdate[15];
  short int ind_birthdate;
  EXEC SQL END DECLARE SECTION;
  EXEC SQL DECLARE C1 CURSOR FOR
    SELECT GivenName || ' ' || Surname,
      Sex, BirthDate
    FROM Employees;
  EXEC SQL OPEN C1;
  for( ;; ) 
  {
    EXEC SQL FETCH C1 INTO :name, :Sex, 
        :birthdate:ind_birthdate;
    if( SQLCODE == SQLE_NOTFOUND ) 
    {
      break;
    } 
    else if( SQLCODE < 0 ) 
    {
      break;
    }

    if( ind_birthdate < 0 ) 
    {
      strcpy( birthdate, "UNKNOWN" );
    }
    printf( "Name: %s Sex: %c Birthdate:
         %s.n",name, Sex, birthdate );
  }
  EXEC SQL CLOSE C1;
}

有关使用游标的完整示例,请参见静态游标示例动态游标示例

游标定位

游标定位在以下三个位置之一:

  • 在一行上

  • 在第一行之前

  • 在最后一行之后

结果集的行在左侧显示从 0 到 n + 1 的编号,在右侧显示从 -n - 1 到 0 的编号

当游标打开之后,它位于第一行之前。可使用 FETCH 语句来移动游标位置。可以将游标定位到相对查询结果开头或结尾的一个绝对位置。也可以相对当前游标位置移动它。请参见FETCH 语句 [ESQL] [SP]

UPDATE 和 DELETE 语句有特殊的定位 版本,可用于更新或删除游标当前位置处的行。如果游标位于第一行之前或最后一行之后,则会返回错误,指示游标中没有相应的行。

可以使用 PUT 语句向游标中插入行。请参见PUT 语句 [ESQL]

游标定位问题

插入 DYNAMIC SCROLL 游标并对其进行某些更新会导致与游标定位有关的问题。除非 SELECT 语句中有 ORDER BY 子句,否则数据库服务器不将插入的行放在游标内可预知的位置。在有些情况下,插入的行要等到关闭并再次打开游标后才会出现。

对于 SQL Anywhere,如果必须创建临时表才能打开游标,则会出现这种情况。

有关说明,请参见在查询处理中使用工作表(使用 All-rows 优化目标)

UPDATE 语句可导致行在游标中移动。如果游标具有一个使用现有索引(未创建临时表)的 ORDER BY 子句,则会出现这种情况。