MySQL 存储过程不适用于 SELECT(基本问题)

Posted

技术标签:

【中文标题】MySQL 存储过程不适用于 SELECT(基本问题)【英文标题】:MySQL Stored Procedures not working with SELECT (basic question) 【发布时间】:2011-01-22 13:18:20 【问题描述】:

我使用的平台(完美表单)要求我对大部分查询使用存储过程,并且从未使用过存储过程,我无法弄清楚我做错了什么。以下语句执行没有错误:

DELIMITER //
DROP PROCEDURE IF EXISTS test_db.test_proc//
CREATE PROCEDURE test_db.test_proc() SELECT 'foo'; //
DELIMITER ;

但是当我尝试使用以下方式调用它时:

CALL test_proc();

我收到以下错误:

#1312 - PROCEDURE test_db.test_proc can't return a result set in the given context

我在 phpmyadmin 3.2.4、PHP 版本 5.2.12 和 mysql 服务器版本是 5.0.89-community 中执行这些语句。

当我编写一个返回参数的存储过程,然后选择它时,一切正常(例如):

DELIMITER //
DROP PROCEDURE IF EXISTS test_db.get_sum//
CREATE PROCEDURE test_db.get_sum(out total int)
BEGIN
SELECT SUM(field1) INTO total FROM test_db.test_table;
END //
DELIMITER ;

工作正常,当我调用它时:

CALL get_sum(@t); SELECT @t;

我得到总和没问题。

最终,我需要做的是在存储过程中包含一个精美的 SELECT 语句,这样我就可以调用它,并返回多个字段的多行。现在我只是想让 any 选择工作。

非常感谢任何帮助。

【问题讨论】:

当你说CALL myproc(); 我假设你的意思是CALL test_proc();? 是的 - 抱歉那是一个类型-o。有什么办法让我编辑吗? 是的,我认为您应该能够编辑自己的帖子。 (应该是某处的编辑链接。) 【参考方案1】:

想通了。这不是 PHP 的错误(尽管它曾经是) - 它是某些版本的 phpmyadmin 中的错误。相同的错误会间歇性地重新出现,然后在各种颠覆中得到修复(见上文):

#1312 - PROCEDURE [name] can't return a result set in the given context

这种行为似乎仅限于 phpmyadmin 内存储过程中的 SELECT 语句

使用像 MySQL Workbench 这样的客户端可以解决这个问题(或者你可以升级 phpmyadmin,但如果你像我一样在共享服务器上,那会很痛苦)。

无论如何,谢谢大家的帮助。

【讨论】:

“解决”了我的问题——也就是说,我可以使用 phpmyadmin 重现该错误,并且它不会出现在 mysql CLI 客户端或 PHP 应用程序本身中。 @tdammers - 嘿,感谢您的验证。有时,当这个板上所有聪明的程序员都告诉我我疯了时,我开始认为我疯了。【参考方案2】:

检查您的 php 版本以查看这是否是已报告的错误(请参阅here)。

看到这个帖子: Can't return a result set in the given context

【讨论】:

我确实看到了那个帖子。我的 PHP 版本是 PHP 版本 5.2.12,据称是在该错误出现之前。【参考方案3】:

这可能集中在处理存储过程/例程中的 PHP 和 SELECT 的错误。一种可能的解决方法是在存储过程中使用 SELECT... INTO 将结果归结为一个变量。这在我阅读的一些other cases 中有效。

   SELECT * FROM category INTO c;

【讨论】:

【参考方案4】:

当我执行以下操作时:

DELIMITER //
DROP PROCEDURE IF EXISTS test_db.test_proc//
CREATE PROCEDURE test_db.test_proc() SELECT 'foo'; //
DELIMITER ;

紧随其后

CALL test_db.test_proc();

我向我展示了一个结果集,例如:

+-----+
| foo |
+-----+
| foo |
+-----+

我正在使用 PHP 5.3.1、MySQL 5.1.41 和 phpMyAdmin 3.2.4。

也许您只是拼错了您的程序名称? 还是您的 PHP 或 MySQL 安装有问题? (可能是一个错误。您是否尝试过更新到最新版本?)

【讨论】:

我检查了名字。我在另一台本地服务器上对其进行了测试。这个运行 PHP 版本 5.2.9、MySQL 5.1.33-community 和 phpmyadmin 3.1.3.1。根据错误报告,该配置应该没有问题。但是,仍然是同样的错误:#1312 - PROCEDURE test_db.test_proc 无法在给定的上下文中返回结果集

以上是关于MySQL 存储过程不适用于 SELECT(基本问题)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 查询适用于 SELECT 但不适用于 UPDATE 语句

MYSQL存储过程select语句select不正确的ID

SQL Server 日期格式不适用于存储过程

序列生成的主键似乎不适用于 select 语句

SQL SELECT 查询不适用于电子邮件地址

MySQL 查询不适用于 NOT IN