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

SAP Sybase SQL Anywhere 16.0 » Ultra Light C/C++ プログラミング » アプリケーション開発 » Embedded SQL を使用した Ultra Light C++ アプリケーション開発 » データのフェッチ

 

複数ローのフェッチ

カーソルは、結果セットに複数のローがあるクエリからローを取り出すために使用されます。カーソルは、SQL クエリ結果セットのためのハンドルつまり識別子であり、結果セット内の位置を示します。

Ultra Light アプリケーションのカーソルは、常に WITH HOLD オプションを使用して開かれます。自動的に閉じられることはありません。CLOSE 文を使用して、各カーソルを明示的に閉じます。

次の手順でカーソルを管理します。

  1. DECLARE 文を使って、特定の SELECT 文のためのカーソルを宣言します。

  2. OPEN 文を使って、カーソルを開きます。

  3. FETCH 文を使用して、一度に 1 つのローをカーソルから取り出します。

  4. 警告 SQLE_NOTFOUND が返されるまで、ローをフェッチします。エラーコードと警告のコードは、SQL Communications Area 構造体で定義される変数 SQLCODE で返されます。

  5. 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;
}
 カーソル位置
 カーソル内のローの順序
 カーソルの再配置
 更新後のカーソル位置
 参照