フェッチとスクロール

カーソルから行を取得する操作をフェッチと呼びます。フェッチ オプションは次のとおりです。

  • FETCH FIRST

    カーソルの最初の行をフェッチします。

  • FETCH NEXT

    最後にフェッチされた行の次の行をフェッチします。

  • FETCH PRIOR

    最後にフェッチされた行の前の行をフェッチします。

  • FETCH LAST

    カーソルの最後の行をフェッチします。

  • FETCH ABSOLUTE n

    n が正の整数の場合、カーソルの最初の行から n 番目の行をフェッチします。n が負の整数の場合、カーソルの最後の行から逆方向に n 番目の行をフェッチします。n が 0 の場合は行をフェッチしません。

  • FETCH RELATIVE n

    最後にフェッチした行から n 番目の行をフェッチします。n が正の数の場合、最後にフェッチした行から順方向に n 番目の行をフェッチします。n が負の数の場合、最後にフェッチした行から逆方向に n 番目の行をフェッチします。n が 0 の場合は同じ行を再度フェッチします。

カーソルを開いたとき、現在の行位置は論理的には先頭行よりも前にあります。これによりカーソルを開いた後に最初に実行したフェッチでは、各フェッチ オプションは次のように動作します。

  • FETCH FIRST

    カーソルの最初の行をフェッチします。

  • FETCH NEXT

    カーソルの最初の行をフェッチします。

  • FETCH PRIOR

    行をフェッチしません。

  • FETCH LAST

    カーソルの最後の行をフェッチします。

  • FETCH ABSOLUTE n

    n が正の整数の場合、カーソルの最初の行から n 番目の行をフェッチします。n が負の整数の場合、カーソル内の最後の行から逆方向に n 番目の行がフェッチされます。たとえば、n = -1 の場合、カーソルの最後の行が返されます。n が 0 の場合は行をフェッチしません。

  • FETCH RELATIVE n

    n が正の数の場合、カーソルの n 番目の行をフェッチします。n が負の数または 0 の場合は行をフェッチしません。

Transact-SQL カーソルは、1 回に 1 行しかフェッチできないように制限されています。API サーバー カーソルは、1 回のフェッチで複数行のブロックをフェッチできます。1 回で複数行をフェッチできるカーソルをブロック カーソルと呼びます。

カーソルの分類

カーソルは、サポートするフェッチ オプションによって次のように分類できます。

  • 順方向専用

    最初の行から最後の行へと順番に行をフェッチする必要があります。許可されるフェッチ操作は FETCH NEXT だけです。

  • スクロール可能

    カーソル内の任意の位置からランダムに行をフェッチできます。すべてのフェッチ操作が許可されます。ただし例外として、動的カーソルは FETCH ABSOLUTE をサポートしません。

スクロール可能なカーソルが特に役立つのは、オンライン アプリケーションをサポートする場合です。カーソルをアプリケーション内のグリッドまたはリスト ボックスにマップできます。ユーザーがグリッドを上下にスクロールしたり 1 周したりすると、アプリケーションは、スクロール フェッチを使用してユーザーが参照するカーソルから行を取得します。

行をフェッチするための API

行をフェッチするために使用する実際のステートメント、関数、またはメソッドに対応する API にはさまざまな名前があります。

  • Transact-SQL カーソルでは、FETCH FIRST、FETCH LAST、FETCH NEXT、FETCH PRIOR、FETCH ABSOLUTE(n)、FETCH RELATIVE(n) の各ステートメントが使用されます。

  • OLE DB では、IRowset::GetNextRowsIRowsetLocate::GetRowsAtIRowsetLocate::GetRowsAtBookmarkIRowsetScroll::GetRowsAtRatio などのメソッドが使用されます。

  • ODBC では SQLFetch 関数が使用されます。この関数は、1 行をフェッチする FETCH NEXT、または SQLFetchScroll 関数と同じです。SQLFetchScroll では、ブロック カーソルとすべてのフェッチ オプション (first、last、next、prior、absolute、relative) がサポートされます。

  • ADO では、MoveMoveFirstMoveLastMoveNextMovePrevious Recordset の各メソッドを使用してカーソル内の位置が取得されます。その位置で 1 行以上の行を取得するときには、GetRows レコードセット メソッドが使用されます。フェッチする行番号を Start パラメータに設定して、GetRows を直接呼び出すこともできます。