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

SQL Anywhere 12.0.0 (中文) » UltraLite - C 及 C++ 编程 » 应用程序开发 » 使用嵌入式 SQL 开发应用程序 » 读取数据

 

读取多行

如果查询的结果集中有多行,可使用游标从中检索行。游标是 SQL 查询结果集的句柄或标识符以及该结果集中的位置。

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

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

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

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

    • 一直读取行,直到返回 SQLE_NOTFOUND 警告。在变量 SQLCODE(在 SQL 通信区结构中定义)中返回错误和警告代码。

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

UltraLite 应用程序中的游标始终是使用 WITH HOLD 选项打开的。它们从不自动关闭。必须使用 CLOSE 语句显式关闭每个游标。

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



void print_employees( void )
{
   int status;
   EXEC SQL BEGIN DECLARE SECTION;
   char name[50];
   char sex;
   char birthdate[15];
   a_sql_len   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]

 游标定位
 游标中行的顺序
 重新定位游标
 更新后定位游标