存储过程直接返回查询结果:Bug、人工产物还是未记录特性?
关于MySQL/MariaDB存储过程直接返回结果集的疑问解答
这是有意实现的标准特性,并非人工产物
你展示的在存储过程中直接用SELECT返回结果集的行为,是MySQL和MariaDB存储过程的标准设计特性,不是意外产物。它和OUT参数是两种互补的结果返回方式:
OUT参数适合返回单个或多个离散变量值- 直接执行
SELECT则用于返回完整的查询结果集,适配批量数据场景
官方文档其实有相关说明,只是未将其作为单独特性高亮——在存储过程执行逻辑的章节中明确提到:存储过程内执行的SELECT语句,会像客户端直接执行查询一样,将结果集发送给调用方。
该特性的存在时长
这个特性从**MySQL 5.0版本(2005年发布)**就已存在,这是MySQL首次支持存储过程的版本。MariaDB从基于MySQL分叉开始就继承了该行为,所有支持存储过程的MySQL/MariaDB版本(包括你测试的MariaDB 10.3)都具备这个特性。
能否依赖这个特性?
完全可以放心依赖:
- 这是稳定的核心行为,官方不会轻易变更,所有支持存储过程的MySQL/MariaDB版本均保持一致
- 主流驱动(包括你提到的MySQLdb、mysql-connector-python、pymysql等)都原生支持处理存储过程返回的结果集,甚至能处理存储过程中多个
SELECT返回的多结果集(比如MySQLdb中可通过cursor.nextset()遍历所有结果集)
你的测试代码(格式化后)
create table foo(foo int); insert into foo values (42); create procedure get_foo() select * from foo; call get_foo(); -- 执行结果: -- +------+ -- | foo | -- +------+ -- | 42 | -- +------+
内容的提问来源于stack exchange,提问作者user209974
相关产品推荐
相关产品推荐

