MySQL 8.4 Release Notes
15.6.6.5 服务器端游标限制
使用 C API 的mysql_stmt_attr_set()
函数实现服务器端游标。同样,存储程序中的游标也使用相同的实现。服务器端游标使得结果集可以在服务器端生成,但除非客户端请求,否则不会传输给客户端。例如,如果客户端执行查询,但只关心第一个行记录,那么剩下的行记录不需要传输。
在 MySQL 中,服务器端游标被物化为内部临时表。初始是MEMORY
表,但当其大小超过max_heap_table_size
和tmp_table_size
系统变量的最小值时,会被转换为MyISAM
表。内部临时表用于游标结果集的限制与其他使用方式相同。见第10.4.4节,“MySQL 中的内部临时表用法”。实现的一个限制是,对于大结果集,通过游标检索行记录可能会很慢。
游标只能读取行记录;不能使用游标更新行记录。
UPDATE WHERE CURRENT OF
和 DELETE WHERE CURRENT OF
不被实现,因为不可更新的游标不支持。
游标不保持打开状态,即使提交事务也不会被保留。
游标是敏感的。
游标不可滚动。
游标没有名称,语句处理器充当游标ID。
你只能打开一个预准备语句对应的游标。如果需要多个游标,你必须准备多个语句。
你不能使用游标来执行生成结果集的语句,如果该语句不支持预准备模式。这包括语句如CHECK TABLE
、HANDLER READ
和 SHOW BINLOG EVENTS
。