情况是我有一个mysql存储过程,它有一些变量,我想根据SELECT使用它们的值来获取我在循环中真正需要的变量列表:
MyTable(varId, varName, typeId)
(0,var1,1)
(1,var2,2)
MyValues(MyVar1,MyVar2)
(1,2)
以下是我想做的事情:
DECLARE var1 ;
DECLARE var2 ;
SELECT MyVar1,MyVar2 INTO var1,var2 FROM MyValues;
CURSOR curs FOR
SELECT varName FROM Mytable WHERE typeId = 1;
LOOP
FETCH curs INTO varName;
SELECT sqrt(varName.value); //Should be 1 because var1 =1;
END LOOP;
似乎不可能用准备好的函数来做,除非我使用会话变量,但实际上我动态地接收var1
和var2
(在curs中)并且我无法将其提取到会话变量中。
有人能给我一些解决这个问题的想法吗?非常感谢!
答案 0 :(得分:0)
首先,为什么要将变量存储在SESSION中? 如果你可以在程序中使用它们,你也可以在程序中使用它们。
同样,如果您需要返回它们,您可以在过程中返回结果集,并在Web编程或应用程序中捕获它们。像:
SELECT @var1, @var2
还有一件事,我不确定我是否正确,但如果您想从外部(您的Web应用程序)获取变量,您也可以将它们作为参数传递。像:
$mysqli->query("CALL procedure_name($parameter1, $parameter2)");
问题编辑后: 我不明白这个..
CURSOR curs FOR
SELECT varName FROM Mytable WHERE typeId = 1;
LOOP
为什么在这里使用光标来选择? 无论如何,我想,你想在下一行使用' varName '。您可以将其存储在另一个变量中:
DECLARE a_variable VARCHAR(50);
SELECT varName INTO a_variable FROM Mytable WHERE typeId = 1;
这里你得到* a_variable *里面的值 使用它:
SELECT sqrt(a_variable);//NOT like varName.value
这是否回答了你的问题?请告诉我。
编辑#3: 我在这里提出了你的问题:
//应为1,因为var1 = 1;
以下是您需要使用的代码:
SET @query = CONCAT('select SQRT(@', var_name, ') as square_root');
-- SELECT @query;
PREPARE stmt FROM @query;
EXECUTE stmt;
以下是我尝试过的完整程序:
DELIMITER $$
CREATE PROCEDURE `test_var`(
)
BEGIN
DECLARE var1 int;
DECLARE var2 int;
DECLARE var_name varchar(50);
SELECT MyVar1,MyVar2 INTO @var1,@var2 FROM MyValues;
SELECT varName INTO var_name FROM Mytable WHERE typeId = 1;
SET @query = CONCAT('select SQRT(@', var_name, ') as square_root');
-- SELECT @query;
PREPARE stmt FROM @query;
EXECUTE stmt;
END
希望,这有帮助。请告诉我。
此致 Mayukh