当前位置: 首页 > 面试题库 >

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

谭泳
2023-03-14
问题内容

我正在使用一个平台(performforms),该平台要求我对大多数查询使用存储过程,并且从未使用过存储过程,所以无法弄清楚自己在做什么错。以下语句执行无错误:

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语句,因此我可以调用它,并返回多个字段的多行。现在,我只是想让 所有 选择工作。

任何帮助是极大的赞赏。


问题答案:

弄清楚了。这不是PHP的错误(尽管曾经是)-在某些版本的phpmyadmin中是错误。相同的错误会间歇性地出现,然后在各种子版本中进行修复(请参见上文):

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

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

使用像MySQL Workbench这样的客户端可以解决此问题(或者您可以升级phpmyadmin,但是如果您使用的是像我这样的共享服务器,那会很麻烦)。

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



 类似资料:
  • 我们前面所学习的 MySQL 语句都是针对一个表或几个表的单条 SQL 语句,但是在数据库的实际操作中,经常会有需要多条 SQL 语句处理多个表才能完成的操作。 例如,为了确认学生能否毕业,需要同时查询学生档案表、成绩表和综合表,此时就需要使用多条 SQL 语句来针对这几个数据表完成处理要求。 存储过程是一组为了完成特定功能的 SQL 语句集合。使用存储过程的目的是将常用或复杂的工作预先用 SQL

  • 问题内容: 我正在尝试创建一个存储过程。这是我到目前为止(不起作用)的内容: HAVERSINE是我创建的可以正常工作的函数。如您所见,我正在尝试从“城市”表中获取城市的ID,然后将cityLat和cityLng设置为该记录的其他值。我显然在这里通过使用SELECTs做错了。 这有可能吗?看来应该如此。任何帮助将不胜感激。 问题答案: 更正了一些问题,并添加了一个替代选择-适当删除。

  • 本文向大家介绍Mysql数据库存储过程基本语法讲解,包括了Mysql数据库存储过程基本语法讲解的使用技巧和注意事项,需要的朋友参考一下 在此之前,小编给大家讲述过MYSQL语法的基本知识,本篇内容,小编通过下面的一个实例,给读者们通过实战中的代码讲解一下基本语法的知识。 一般情况下MYSQL以;结尾表示确认输入并执行语句,但在存储过程中;不是表示结束,因此可以用该命令将;号改为//表示确认输入并执

  • 问题内容: 我有一个存储过程返回行: 我的实际过程稍微复杂一点,这就是为什么需要一个sproc的原因。 是否可以通过调用此过程来选择输出? 就像是: 我需要使用,和其他子句来分页数据,而且我真的不想将这些值作为参数传递。 问题答案: 您可以使用用户定义的函数或视图代替过程。 一个过程可以返回多个结果集,每个结果集都有自己的模式。它不适合在语句中使用。

  • 问题内容: 我在任何地方都找不到此答案,但是可以从MySQL中的另一个存储过程调用存储过程吗?我想找回标识值,并在父存储过程中使用它。我们不能再使用FUNCTIONS! 问题答案: 参数应该可以帮助您将值返回给调用过程。基于此,解决方案必须是这样的。

  • 问题内容: 我试图了解MySQL存储过程,我想检查用户登录凭据是否有效,如果有效,请更新用户的在线状态: 如何基于结果集的行数== 1或id不为空的if语句? 问题答案: 注意:我还没有测试过。MySQL可能不喜欢针对当前为其打开了游标的表的UPDATE。 PS:您应该重新考虑如何存储密码。 重新评论vs. vs.结果集: 仅用于存储函数,不用于存储过程。当您要在另一个SQL表达式中调用例程时,将