サーバー側のカーソルは、mysql_stmt_attr_set()
関数を使用して C API に実装されます。ストアドルーチンのカーソルにも同じ実装が使用されます。サーバー側のカーソルによって、サーバー側で結果セットを生成できるようになりますが、クライアントが要求する行を除いてクライアントに転送することはできません。たとえば、クライアントがクエリーを実行するが、最初の行のみが必要な場合、残りの行は転送されません。
MySQL では、サーバー側のカーソルは内部一時テーブルに実体化されます。最初これは MEMORY
テーブルですが、そのサイズが max_heap_table_size
および tmp_table_size
システム変数の最小値を超えると、MyISAM
テーブルに変換されます。カーソルの結果セットを保持するために作成された内部一時テーブルには、内部一時テーブルをほかに使用する場合と同じ制約が適用されます。セクション8.4.4「MySQL が内部一時テーブルを使用する仕組み」を参照してください。この実装の制限の 1 つには、大きな結果セットの場合に、カーソルによる行の取得に時間がかかることがあるというものがあります。
カーソルは読み取り専用です。カーソルを使用して行を更新できません。
UPDATE WHERE CURRENT OF
および DELETE WHERE CURRENT OF
は、更新可能なカーソルがサポートされていないため実装されません。
カーソルは保持不可能です (コミット後、開いたままにはできません)。
カーソルは非センシティブです。
カーソルはスクロール不可です。
カーソルには名前が付けられません。ステートメントハンドラがカーソル ID として機能します。
準備済みステートメントごとに、カーソルを 1 つだけ開いておくことができます。複数のカーソルが必要な場合は、複数のステートメントを準備する必要があります。
結果セットを生成するステートメントで、準備モードでサポートされていないものにはカーソルを使用できません。このようなステートメントには、CHECK TABLE
、HANDLER READ
、SHOW BINLOG EVENTS
などがあります。