今天在用go-sql-driver做MySQL driver调用MySQL的存储过程时遇到一个罕见的报错。本文对这个错误及其解做一个简单的总结。

1 问题描述

按照go中sql包提供的接口,应用层代码调用MySQL存储过程的代码一般如下所示:

       result, err := dbh.Exec("call some_procedure(?, ?)", param1, param2)
if err != nil {
// error handler
} // using result...

  但是在实际执行的时候err不为nil,err的值是MySQL返回给driver的出错信息:

Error 1312: PROCEDURE tcheck_db.update_vs_available can't return a result set in the given context

2  问题原因

出现这个问题的原因是在调用存储过程时,MySQL希望客户端的连接类型是multi-statement模式,但是go-sql-driver这个包目前没有设置这个连接模式,所以MySQL给返回了1中的错误。

实际上,在用go-sql-driver时,除了无法调用存储过程外,还存在一些其他的限制,这些限制可以在go-database-sql-surprises中看到。

go-sql-driver的讨论区也有人报出了这个问题,见这里

3 问题解法

既然找到了病因,那就要对症下药,能想到的办法就是将go-sql-driver连接MySQL时的connection mode设置为multi-statement。方法是:

1) go get github.com/go-sql-driver/mysql 下载依赖包

2)编辑文件src/github.com/go-sql-driver/mysql/packets.go文件,在函数writeAuthPacket(cipher []byte) (大约在210行)的客户端标志位处添加下面两个标志:

 clientMultiStatements 和 clientMultiResults

添加后的代码如下:

func (mc *mysqlConn) writeAuthPacket(cipher []byte) error {
// Adjust client flags based on server support
clientFlags := clientProtocol41 |
clientSecureConn |
clientLongPassword |
clientTransactions |
clientLocalFiles |
clientMultiStatements | // 添加这行
clientMultiResults | //再添加这行
mc.flags&clientLongFlag if mc.cfg.clientFoundRows {
clientFlags |= clientFoundRows
} ...

3,rebuild您的依赖go-sql-driver的代码。

OK。经过上面三步修改之后,执行1中的存储过程代码时,就不会报错了。

Golang 用go-sql-driver 调用MySQL存储过程时的问题排查的更多相关文章

  1. spring mybatis 3.2调用mysql存储过程返回多结果集(完整、亲测、可用)

    最近,有个开发提了个需求,希望中间件支持调用mysql存储过程时支持多结果集返回,因为某些原因我们使用了不少的存储过程,很多复杂的逻辑目前来看交互非常的多,所以从当前的现状来说,这个需求还是蛮合理的. ...

  2. PHP调用MYSQL存储过程实例

    PHP调用MYSQL存储过程实例 标签: mysql存储phpsqlquerycmd 2010-09-26 11:10 11552人阅读 评论(3) 收藏 举报 实例一:无参的存储过程$conn = ...

  3. 调用MYSQL存储过程实例

    PHP调用MYSQL存储过程实例 http://blog.csdn.net/ewing333/article/details/5906887 http://www.cnblogs.com/kkchen ...

  4. php调用mysql存储过程

    MYSQL存储过程 原文链接:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html 一.存储过程简介(mysql5.0以上支持) 我们常用的操作数据 ...

  5. SQL 语句调用这个存储过程,生成顺序编码

    一直很讨厌存储过程,没想到今天帮了我大忙啊,或许会因为今天让我慢慢喜欢上存储过程吧,不多说了,切入正题 在使用数据库的时候,难免要在使用过程中进行删除的操作,如果是使用int类型的字段,令其自增长,这 ...

  6. 在PL/SQL中调用Oracle存储过程

    存储过程 1 什么是存储过程? 用于在数据库中完成特定的操作或者任务.是一个PLSQL程序块,可以永久的保存在数据库中以供其他程序调用. 2 存储过程的参数模式 存储过程的参数特性: IN类型的参数 ...

  7. Java调用MySQL存储过程

    Java调用MySQL的存储过程,需要用JDBC连接,环境eclipse 首先查看MySQL中的数据库的存储过程,接着编写代码调用 mysql> show procedure status; + ...

  8. PHP多次调用Mysql存储过程报错解决办法

    PHP多次调用Mysql数据库的存储过程会出现问题,主要问题为存储过程中执行多次SQL语句不能一一释放导致的,网上找了一些解决办法,比如使用 multi_query 然后一个一个释放,但是发现根本不适 ...

  9. hibernate调用mysql存储过程

    在mysql中创建两个存储过程,如下: 1.根据id查找某条数据: )) begin select * from emp where empId=id; end; 2.根据id查找某个字段,并返回 ) ...

随机推荐

  1. linux下性能分析命令[总结]

    1.前言 在linux下开发程序,为了追求高性能,经常需要测试程序的性能,包括cpu.内存.io.网络等等使用情况.liunx下提供了众多命令方便查看各种资源的使用情况.经常用的有ps.top.fre ...

  2. IIS发布网站遇到 编译器错误消息: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary 编

    编译错误: 说明:在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息:CS0016: 未能写入输出文件“c:\Windows\Microso ...

  3. JavaScript判断变量是否为数组的方法(Array)

    废话不多说直接上一个代码: 1.这里是通用的检测方法 /* * 判断是否是数组 */ function isArray(obj){ return Object.prototype.toString.c ...

  4. 微信、支付宝App支付-JPay0.0.2发布

    JPay 对微信App支付.支付宝App支付的二次封装,对外提供一个相对简单的接口以及支付结果的回调 GitHub:https://github.com/Javen205/JPay OsChina:h ...

  5. Robotframework(1):配置基础环境

    转载:http://www.cnblogs.com/CCGGAAG/p/7800324.html 最近对Robotframework这款基于python的框架比较感兴趣,于是想着来研究一下,下面我们来 ...

  6. C#.NET常见问题(FAQ)-如何使用DataGridView跟Excel数据交互

    1 从工具箱中拖进来一个DataGridView   2 就像Excel表头,可以添加一个表头(即一列的抬头,比如叫做A)   3 一次添加ABCDE等项目,也可以修改该类目的类型为Button或者C ...

  7. Spring开发 - 通过实现ApplicationContextAware在Servlet中调用注解的Service

    用过Spring MVC的人都知道,我们如何在Controller中注入Service,可以使用@Resource注解的方法. 有时候,实际在项目的过程中,我们需要在某个Servlet中使用Servi ...

  8. Android 之 沉浸式状态栏及顶部状态栏背景色设置

    现在很多应用都引用了沉浸式状态栏,如QQ,效果下图: 效果很酷炫,其实设置也很简单.但是,需要注意的是,这种效果只能在API19以及以上版本中才能够做到. 方法一: 首先,如果想让界面Activity ...

  9. IPC's epoch 6 is less than the last promised epoch 7

    一.错误起因 Active NameNode日志出现异常IPC‘s epoch [X] is less than the last promised epoch [X+1],出现短期的双Active ...

  10. PetaPoco使用

    <?xml version="1.0" encoding="utf-8" ?> <configuration> <connecti ...