将MySQL Select查询结果存入变量

3
我希望能在程序中进一步使用从select获取的值进行执行,但我不知道如何做到。
作为测试,我编写了以下内容,但无法在进一步的逻辑中使用v_1、v_2或v_3变量,因为它们没有像我预期的那样获取值1、2和3...
DROP PROCEDURE IF EXISTS MPT_testing; DELIMITER //  CREATE PROCEDURE MPT_testing() READS SQL DATA BEGIN

  DECLARE v_1 INT;   DECLARE v_2 INT;   DECLARE v_3 INT;
     SET @sql=CONCAT('SELECT 1,2 into v_1, v_2');   PREPARE s1 FROM @sql;   EXECUTE s1;   DEALLOCATE PREPARE s1;

  SET v_3 = v_1 + v_2;

  SELECT v_3;

END //

DELIMITER ;

请问有人可以帮忙吗?

谢谢, Leo

3个回答

5

嗯,尝试过了但不起作用。问题似乎更与准备/执行/释放相关。如果我直接执行select into语句,它就可以工作:“DECLARE myvar INT; DECLARE myvar2 INT; SELECT 1,2 into myvar, myvar2; SELECT myvar, myvar2;”,但是当我首先准备sql语句时,它似乎无法识别变量,并且抱怨它未被声明:“DECLARE myvar INT; DECLARE myvar2 INT; SET @sql=CONCAT('SELECT 1,2 into myvar, myvar2'); PREPARE s1 FROM @sql; EXECUTE s1; DEALLOCATE PREPARE s1; SELECT myvar, myvar2;”。 - Leo
现在找到了解决方案:http://forums.mysql.com/read.php?98,186645,186658#msg-186658 - Leo

2

如果你的程序不需要动态SQL,可以使用更简单的语法:

DECLARE v_1 INT;   DECLARE v_2 INT;   DECLARE v_3 INT;

SELECT 1,2 into v_1, v_2;
SET v_3 = v_1 + v_2;
SELECT v_3;

在存储过程中使用声明的普通变量比使用用户定义变量(@变量)更安全,因为调用另一个存储过程可能会更改您的用户定义变量值。


谢谢slaakso,问题是我需要动态SQL,由于从不同的表和其他条件中选择,我需要先动态准备查询。 - Leo

0

您需要修改一点代码才能正常工作,请查看我的修改。

DECLARE v_1 INT;
DECLARE v_2 INT;
DECLARE v_3 INT;

SET @sql=CONCAT('SELECT 1,2 into @v1, @v2');
PREPARE s1 FROM @sql;
EXECUTE s1;

SELECT @v1, @v2 INTO v_1, v_2;
SET v_3 = v_1 + v_2;
SELECT v_3;

DEALLOCATE PREPARE s1;

虽然这段代码可能回答了问题,但提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。一个好的答案总是会解释做了什么以及为什么以这种方式完成,不仅为了OP,也为了未来访问Stack Overflow的用户。 - Jay Blanchard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接