MYSQL 错误 #2014:结果集为空时在存储过程中

Posted

技术标签:

【中文标题】MYSQL 错误 #2014:结果集为空时在存储过程中【英文标题】:MYSQL Error #2014: in stored procedure when resultset is empty 【发布时间】:2019-03-03 09:58:21 【问题描述】:

我正在尝试使用 phpmyadmin(v4.7.9) 在 mysql(v5.7.21) 中创建一个存储过程,该过程有时会返回一个空结果集。

CREATE DEFINER=`my_database`@`%` PROCEDURE `emptytest`(IN `_id` INT(11))
NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER
    select * from my_table where id=_id

然后调用它:

call emptytest(1);

当 id 存在于表中时,这可以正常工作:

id  name
--------
1   bob

但是当没有要返回的行时抛出错误:

call emptytest(11);
#2014 - Commands out of sync; you can't run this command now

但是我希望它返回与运行 SQL 语句相同的结果:

select * from my_table where id=11

这是一个空列表:

id  name
--------

我一直在 *** 上寻找类似的问题,但其中大多数解决了多个查询的问题,这不是我的情况。

据我所知,MySQL 文档指出过程应该能够返回表。

对于示例,我展示了 phpmyadmin 使用的默认选项,但我尝试调整它们无济于事。

我错过了什么?

【问题讨论】:

【参考方案1】:

程序没有问题。

在 SQL 选项卡中使用 CALL 执行时不处理存储过程的是 phpMyAdmin。

您可以通过单击左侧导航树中过程名称前面的图标来运行该过程。

【讨论】:

你好 Slaakso,感谢你的贡献,我不确定我是否理解你。你是在告诉我,当被调用时,例如 PHP 中的 mysqli::query。它会返回一个没有错误的空结果集,即使我没有在过程中明确处理任何错误?我仅将 phpMyAdmin 用作开发辅助工具,所以我担心它是否会在它之外工作。 空查询可以很好地使用 mysqli::query。无需在过程中设置退出处理程序。您看到的问题只是phpMyAdmin的SQL查询编辑器的限制,与mysqli无关。 phpMyAdmin 不是程序编辑的理想工具。 如果我理解了 OP 的意思,那可能不太正确 - 这只是空结果集的问题(这并不是说我可能不会领导 OP沿着花园小路走……;))。如果您所说的是对问题的正确诊断,那么它将影响对 SP 的所有调用。 “命令不同步”错误发生在使用连接并在使用前一个数据之前执行新查询时(即,这是客户端错误)。 phpMyAdmin 不仅仅是在处理 SQL 输入时执行查询。 phpMyAdmin 有单独的 UI 用于执行存储过程,这将正确处理空结果集调用。 确实,phpMyAdmin 以某种方式将我的简单查询转换为 25 行 SQL。错误的似乎与:“SET FOREIGN_KEY_CHECKS = ON;”有关。无论如何,我现在意识到这是 phpMyAdmin 的一个限制,它可以在 MySQL 控制台中完美运行。感谢两位的见解。【参考方案2】:

与简单语句相比,存储过程对错误的处理往往“更麻烦”(见下文),因此您需要为该错误添加一个处理程序。

DECLARE EXIT HANDLER FOR 2014 BEGIN select 'empty set' as `Error`; END;

这里的原则是,你不能在一个简单的查询中真正处理这些错误,所以,出于必要,它们被忽略了;你可以在 SP 中处理它们,所以,好吧,处理它们......

【讨论】:

这将帮助 phpMyAdmin 解决它的问题。该过程并不真正需要。 @Tom:我尝试了您的建议,我相信这是朝着正确方向迈出的一步,但是仍然存在 2 个疑问:1)我想返回一个空结果集(包含所有表格列,但没有rows) ,我必须像在您的示例中那样手动定义它吗? 2)当我只想处理空结果集时,我应该处理 2014 年吗?听起来它以后可能会捕获不相关的“命令不同步”错误。 省略退出处理程序,您将获得空结果集。即使没有返回行,您仍然可以从查询中获取列标题/类型。 好吧,我已经使用 mysql 工作台运行了一个测试,我得到了一个空的结果集(即你想要的 - 列名,但没有数据)。所以,我只能假设 slaakso 在上面的正确路径上,并且 phpmyadmin 出于某种原因不喜欢空的结果集。我的解决方案可能“有效”,但我认为它隐藏了真正的问题(除了 phpmyadmin 有点垃圾?)。阅读:***.com/questions/8891179/… 最后一条评论看起来很中肯(如果不是特别有用;)) 是的,我以前读过它,特别是 Eric Leschinski 的 Anwser 似乎非常中肯,但显然我们都从不同的查询中偶然发现了相同的 phpmyadmin 限制。尽管原始问题及其解决方案都不同,但我也相信这两个问题应该联系起来:)

以上是关于MYSQL 错误 #2014:结果集为空时在存储过程中的主要内容,如果未能解决你的问题,请参考以下文章

当使用 Ajax Laravel 的 datepicker 为空时在 DB 中插入 NULL

mysql5.7.23使用JSON_EXTRACT函数后返回结果集为空

在 400 HTTP 响应时在警报视图上显示 API 响应 JSON 格式的错误结果

java使用jdbc连接mysql数据库,表里有记录,但是查询的结果集为空,是啥原因

Powershell ISE 崩溃时在哪里存储选项卡?

你好,问一下你的mysql主从同步中show master status,结果为空时怎么解决的?