サーバー側のカーソルは、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
などがあります。