0

情况是我有一个 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;

除非我使用会话变量,否则似乎不可能使用准备好的函数来做到这一点,但实际上我动态地(在 curs 中)接收var1andvar2并且我无法将其提取到会话变量中。

谁能给我一些想法来解决这个问题?非常感谢!

4

1 回答 1

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

希望这可以帮助。请告诉我。

问候马尤赫

于 2013-03-05T18:02:44.637 回答