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 Embedded SQL » データのフェッチ

 

ESQL でのカーソルの使用

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

カーソルの概要については、カーソルを使用した操作を参照してください。

♦  Embedded SQL でカーソルを管理するには、次の手順に従います。
  1. DECLARE 文を使って、特定の SELECT 文のためのカーソルを宣言します。

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

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

  4. ローが見つかりません」という警告が返されるまで、ローをフェッチします。

    エラーと警告は、SQLCA 構造体で返されます。SQLCA (SQL Communication Area)を参照してください。

  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 句がカーソルに指定されている場合に発生します (テンポラリ・テーブルは作成されません)。