【问题标题】:Variable's name in another variable mysql另一个变量mysql中的变量名
【发布时间】:2013-03-05 17:55:36
【问题描述】:

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

除非我使用会话变量,否则似乎不可能使用准备好的函数来执行此操作,但实际上我会动态收到 var1var2(在 curs 中),我无法将其提取到会话变量中。

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

【问题讨论】:

    标签: mysql variables loops cursor session-variables


    【解决方案1】:

    首先,为什么要将变量存储在 SESSION 中? 如果你能在过程中得到它们,你也可以在过程中使用它们。

    同样,如果您需要返回它们,您可以在您的过程中返回一个结果集,并在您的网络编程或应用程序中捕获它们。喜欢:

    SELECT @var1, @var2
    

    还有一件事,我不确定我是否正确,但如果您想要来自外部(您的网络应用程序)的变量,您也可以将它们作为参数传递。喜欢:

    $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
    

    希望,这会有所帮助。请告诉我。

    问候 马尤克

    【讨论】:

    • 谢谢你的回答,我想我不是很清楚。我从应用程序中什么也没得到,我从数据库内的表中获取变量名(在光标中选择它们)。我写“varName.Value”的方式只是为了表达我想强制mysql将varName的值视为变量名的事实。在这种情况下,我们有:varName = 'var1'; var1 = 1; 而我想处理:SELECT sqrt(1); 等价于SELECT sqrt(var1); 但是mysql会处理:SELECT sqrt(varName); 等价于SELECT sqrt('var1');(这没有意义..)。
    • 对于会话变量,我不想使用它,这只是因为我想出的解决方案的唯一开始是执行一个无法访问 SP 变量的准备好的语句,所以我需要改为在会话中设置变量,但这似乎不是很好的习惯,最终还是不能在游标中使用它..
    • 嗨@Jean。编辑了我的答案。
    • 嗨@Mayukh Roy,我正在使用光标,因为在实际情况下,选择中会有几行,我想在每一行上逐行执行该函数。你写的将执行:SELECT sqrt('var1'); 所以一个字符串的平方根而不是我认为的字符串指向的值的平方根。
    • 会话变量的问题是我从游标中得到了很多 var 并且 mysql 禁止将它们直接放入会话变量中,因为他们声称这是一个坏习惯..(有一些技巧这样做,但如果不干净,我宁愿避免。)
    猜你喜欢
    • 2020-10-09
    • 2015-11-04
    • 2014-01-12
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2021-03-02
    • 1970-01-01
    相关资源
    最近更新 更多