サーバサイドカーソルは、mysql_stmt_attr_set()
関数を介して C API に実装されます。ストアド
ルーチンのカーソルにも同じ実装が使用されます。サーバサイドカーソルによって、結果セットをサーバ側で生成することが可能になりますが、クライアントが請求した行以外をクライアントに転送することはできません。例えば、もしクライアントがクエリを実行し、しかし最初の行しか必要としない場合は、残りの行は転送されません。
MySQL
では、サーバサイドカーソルは一時テーブルへと出力されます。最初、これは
MEMORY
テーブルになりますが、そのサイズが
max_heap_table_size
システム変数の値に達すると、MyISAM
テーブルに変換されます。この実装の制限のひとつとして、大きな結果セットでは、カーソルでの行の呼び出しに時間がかかる場合があります。
カーソルは読み取り専用で、カーソルを行のアップデートに使用することはできません。
UPDATE WHERE CURRENT OF
および
DELETE WHERE CURRENT OF
は、アップデート可能なカーソルはサポートされていないため実装されていません。
カーソルは保持不可能 ( コミットの後で開いたままにしておくことができない )。
カーソルはセンシティブです。
カーソルはスクロール不可能。
カーソルに名称は付いていません。ステートメント ハンドラがカーソル ID として作用します。
プリペアド ステートメントごとに、カーソルをひとつだけ開いておくことができます。複数のカーソルが必要な場合は、複数のステートメントを準備しなければなりません。
結果セットを生成するステートメントで、準備モードでサポートされていないものにはカーソルを使うことはできません。そのようなステートメントには、CHECK
TABLES
、HANDLER READ
、そして
SHOW BINLOG EVENTS
があります。