【发布时间】:2014-02-18 22:30:44
【问题描述】:
我已经开始检查 MySQL 中的过程,但我所有的努力都没有奏效。这是我的程序创建:
DELIMITER //
CREATE PROCEDURE test(IN a INT)
BEGIN
SELECT *
FROM `table`
WHERE `id` = a;
END
MySQL 返回正常,没有错误。
DELIMITER ;
MySQL 返回正常,没有错误。
但是 CALL-Statement 不起作用:
CALL test(8);
返回错误: #1312 - PROCEDURE dbxyz.test 无法返回给定上下文中的结果集
现在,我不知道自己做错了什么:Procedure-Cration 中的错误或 CALL-Statement 中的错误。
--> ##########################
截至 2014 年 2 月 6 日: 今天,我试图找出为什么我的存储过程在 phpMyAdmin 的查询窗口中不起作用。 'SELECT *' 在存储过程中不起作用,但逐列的 SELECT 确实起作用。这是我发现的:使用 IN 和 OUT 以及 INTO。示例:
DELIMITER //
CREATE PROCEDURE test(IN a INT, OUT b VARCHAR(12), OUT c INT)
BEGIN
SELECT b, c
FROM `table`
WHERE `id` = a
INTO b, c;
END
现在,这个存储过程可以在phpMyAdmin中运行了:
call test(5, @result1, @result2);
SELECT @result1, @result2
如果你只需要一个结果而不是两个或更多,你也可以使用 SET - 语句。我们在这里:
DELIMITER //
CREATE PROCEDURE test(IN a INT, OUT b INT)
BEGIN
SET b = ( SELECT b
FROM table
WHERE id = a );
END
【问题讨论】:
-
并非如此。我已经在 phpMyAdmin 的查询窗口中设置了这个查询。
-
嗯,您的查询看起来是正确的。我怀疑这是一个偶尔出现的 phpMyAdmin 问题,每个 this answer。如果您的
CALL在 MySQL 客户端或工作台中工作,则它是 phpMyAdmin 错误。如果没有,我们有更多信息。 -
今天,我试图找出为什么我的存储过程不起作用。 'SELECT *' 在存储过程中不起作用,但逐列的 SELECT 确实起作用。这是我发现的:DELIMITER // CREATE PROCEDURE test(IN a INT, OUT b VARCHAR(12), OUT c INT) BEGIN SELECT b, c FROM
tableWHEREid= a INTO b, c; END 现在我可以运行我的程序了: call test(5, @result1, @result2);选择@result1,@result2 -
你需要的是一个存储函数而不是过程。两者的区别在于存储函数返回结果,而存储过程是没有返回结果的函数。您可以传递将填充数据的变量,就像您所做的那样,但要让它以您认为的原始方式工作 - 您需要创建一个函数。