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(基本问题)的主要内容,如果未能解决你的问题,请参考以下文章