首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
Vibe Coding这一年:从“代码苦力”到“超级个体”,我如何把3天的工作压缩进2小时?
2
小程序项目架构设计与基础页面搭建(基础)
3
微信小程序送补贴!手把手教你薅免费云开发资源+混元Token(附使用教程)
4
如何创建一个有效的阅读清单?
5
踩坑记:Elasticsearch 索引写不进去了?可能是触碰了这个隐藏限制
6
RoLID-11K:面向小目标检测的行车记录仪路边垃圾数据集
7
mysql报错通用排查方法 排查MY-001312 can't return a result set in the given context
8
安装并使用谷歌AI编程工具Antigravity(亲测有效)
9
解密Prompt系列68. 告别逐词蹦字 - Transformer 的新推理范式
10
技术人的人生战略:在代码与成长中寻找平衡
11
JavaScript 文件分析与漏洞挖掘指南
12
多 Agent 视角下的自动驾驶系统设计:车端 Agent 与 RSU Agent 协同机制解析
13
构建AI智能体:潜藏秩序的发现:隐因子视角下的SVD推荐知识提取与机理阐释
14
告别浏览器!用Rust打造一键JSON处理神器
15
仅需1元,基于 LangChain 和腾讯混元大模型,实现知识图谱
16
轻量高效!用Docker运行Gogs,搭建属于你的私有GitHub
17
构建AI智能体:SVD知识整理与降维:从数据混沌到语义秩序的智能转换
18
2025年CodeBuddy是如何拯救职场危机中的我?
19
轻量化知识库方案:Docker部署Dokuwiki 的最佳实践
20
踩坑实录:别被 extended_bounds 骗了!ES 直方图聚合的边界陷阱
21
步履不停,共鸣常在:我的 2025 技术旅程与回响
22
构建AI智能体:从SVD的理论到LoRA的实践:大模型低秩微调的内在逻辑
23
[MYSQL] 恢复被drop/truncate的表
24
Sugo Protector 代码保护效果分析报告
25
前端平台大仓应用稳定性治理之路|得物技术
26
C++的5种高级初始化技术:从reserve到piecewise_construct等
27
HierLight-YOLO:面向无人机航拍的层次化轻量目标检测网络
28
金融服务领域的智能体革命:AI智能体解决方案、产业分析与技术实施的战略分析
29
大模型提示词-新手篇
30
2025,一个普通开发者的社区成长地图
31
“氛围编程”正让创意本身成为最终技能
32
AD域攻防权威指南:九.利用备份组获取域Hash
33
【跟着AI学】H5射击游戏开发实录:射击游戏
34
这一年,熬过许过夜,也有些许收获 | 2025年终总结
35
2025,一个技术徘徊者的AI工具真实答卷
36
告别手撸架构图!AI+Ooder实现漂亮架构+动态交互+全栈可视化实战指南
37
GitHub 霸榜:让你的 Claude 拥有“设计总监”级的品味,只要一行命令
38
构建AI智能体:AI古典文学:基于LoRA微调本地大模型打造唐诗生成器
39
拥抱人机共生,锻造不可替代的“金头脑”
40
[MYSQL] 5.7能否从ibdata1中提取出表DDL
41
Spring Boot 实战:手把手教你实现腾讯云 COS 对象存储文件上传
42
解密Prompt系列67. 智能体的经济学:从架构选型到工具预算
43
Google OCS光路解耦揭秘:寒武纪大爆发,从供应链双轨到CPO百万卡全光计算织物
44
未来已来 | 写给 .NET 开发者的 2025 年度总结
45
MYSQL实战:深入理解内存临时表优化
46
Ooder框架规范执行计划:企业级AI实施流程与大模型协作指南
47
openGauss 核心体系架构深度解析
48
架构视角:Jackson3新特性
49
LLM架构机制管窥:作为黑板的上下文窗口
50
LiveKit Agents 深度技术架构剖析
清单首页123文章详情

mysql报错通用排查方法 排查MY-001312 can't return a result set in the given context

导读

群里有位大佬遇到个问题: 执行存储过程时,报错:"can’t return a result set in the given context"

大概长这样:

从描述来看是: 在给定的上下文中不能返回结果集.

在日常使用中, 难免会遇到类似的这种报错, 此时我们就需要一种通用的方法来帮我们定位问题.

排查过程

通常这种报错都有报错码, 比如"MY-001312"之类的(有的驱动可能会把报错码屏蔽/转换掉,就离谱).

搜索报错关键字

我们可以根据报错内容去源码的"share/messages_to_clients.txt"中查看报错关键字ER_SP_BADSELECT

根据关键字搜索报错逻辑

然后我们就可以根据关键字(ER_SP_BADSELECT)去源码里面找到相关的逻辑了.

代码语言:shell
复制
grep -r ER_SP_BADSELECT sql/

通常sql处理相关的在sql目录, innodb存储相关的在storage/innobase. 不清楚的话, 就整个源码目录搜索吧(建议排除掉test之类的目录, 毕竟那里面大部分报错码都有...)

本次我们运气好, 只有一个地方sql/sql_call.cc包含报错关键字, 有很多报错都会存在于多个地方.

根据源码分析逻辑

既然已经找到报错的源码了, 接下来就是分析逻辑了; 有编程基础的话, 看个大概就能知道逻辑了, 如果没得编程基础的话, 可以交给AI.

代码语言:c++
复制
    if (!thd->get_protocol()->has_client_capability(CLIENT_MULTI_RESULTS)) {
      // Client does not support multiple result sets
      my_error(ER_SP_BADSELECT, MYF(0), sp->m_qname.str);
      return true;
    }

本次的触发逻辑也比较简单, 就是客户端连接时候设置的Capabilities Flags没有CLIENT_MULTI_RESULTS就报错ER_SP_BADSELECT

验证

既然我们已经知道了原因: client_capability没有CLIENT_MULTI_RESULTS, 那我们就模拟验证下. 不同的驱动设置client_capability的方法可能不同, 所以这次我们使用自己编写的驱动(https://github.com/ddcw/ddcw/tree/master/python/minipymysql)来验证. 需要稍微修改下:

  1. 在247行添加self.client_flag = 33531525 if 'client_flag' not in kwargs else int(kwargs['client_flag']) 方便我们设置client_flag
  1. 在308行添加client_flag = self.client_flag 启用我们设置的client_flag

然后使用类似如下连接(参考的pymysql)验证即可:

代码语言:sql
复制
-- 创建测试的存储过程
create table db1.t20260112(id int, name varchar(200));
insert into db1.t20260112 values(1,'ddcw');
delimiter //
create procedure pro_select_table_rows( IN rows1 int)
begin
select * from db1.t20260112 limit rows1;
end//
delimiter ;
代码语言:python
复制
# 使用如下python代码验证
# 正常情况(含CLIENT_MULTI_RESULTS)下调用存储过程
import pymysql
conn = pymysql.connect(
	host='192.168.101.21',
	port=3314,
	user='root',
	password='123456',
	)

cursor = conn.cursor()
cursor.execute('call db1.pro_select_table_rows(1)')
cursor.fetchall()

# 异常情况下(去掉CLIENT_MULTI_RESULTS)调用存储过程
import pymysql
conn = pymysql.connect(
	host='192.168.101.21',
	port=3314,
	user='root',
	password='123456',
	client_flag=33531525-(2**17),
	)

cursor = conn.cursor()
cursor.execute('call db1.pro_select_table_rows(1)')
cursor.fetchall()

我们发现去掉CLIENT_MULTI_RESULTS之后确实会报错"can't return a result set in the given context", 说明我们分析得没毛病!

总结

  1. 本次的"can't return a result set in the given context" 报错原因为:驱动未设置/不支持CLIENT_MULTI_RESULTS导致的.
  2. 虽然本次介绍的是通用的报错排查方法, 但基础知识还是很重要的. 比如不知道mysql连接协议, 就不知道CLIENT_MULTI_RESULTS能在连接的时候设置.
下一篇
举报
领券