2014-01-19 25 views
4

我想在用户定义的函数内动态地创建一个变量名,但它似乎不起作用。有没有办法做到这一点或通过使用数组变量?MySQL构建变量名称?

我有一个由7个字符组成的字符串,代表了一周中的几天(1234567或1_3_5_7等)。我想要评估每天选择一周的频率(从0到7)。我想,这将是最容易使用的循环要经过所有的7个位置,但我得到一个错误信息说

[错误] 1193 - 未知的系统变量“CONCAT”

任何提示我如何才能做到这一点?这是我的代码:

DELIMITER $$ 

DROP FUNCTION IF EXISTS fn_freq$$ 

CREATE FUNCTION fn_freq(days INT) RETURNS INT 

BEGIN 
     DECLARE D1 VARCHAR(1); 
     DECLARE D2 VARCHAR(1); 
     DECLARE D3 VARCHAR(1); 
     DECLARE D4 VARCHAR(1); 
     DECLARE D5 VARCHAR(1); 
     DECLARE D6 VARCHAR(1); 
     DECLARE D7 VARCHAR(1); 

     DECLARE x INT; 
     DECLARE fn_freq INT; 
     SET x =1; 
     SET fn_freq = 0; 

     WHILE x < 8 DO 
      SET CONCAT('D',x) = MID(days, x, 1); 
      IF CONCAT('D',x) = '_' THEN 
      ELSE 
       SET fn_freq = fn_freq + 1; 
       SET x = x + 1; 
      END IF; 
      SET x = x + 1; 
     END WHILE; 

     RETURN fn_freq; 
END$$ 

DELIMITER ; 

回答

0

你不能SET CONCAT as in SET CONCAT('D',x) = MID(days, x, 1)什么,而不是我想会更好申报&的CONCAT值设置为变量,并使用该变量的IF条件。此外,我认为你错过了在IF条件为真的情况下必须完成的事情。

0

感谢您的回复。我是这样工作的,但我仍然好奇,在其他一些情况下如何动态创建变量。

对于这个函数,我意识到我甚至不需要该变量,因为我可以直接在if子句中对它进行评估。

DELIMITER $$ 

DROP FUNCTION IF EXISTS fn_freq$$ 
CREATE FUNCTION fn_freq(days VarChar(7)) RETURNS INT 
BEGIN 
     DECLARE x INT; 
     DECLARE fn_freq INT; 
     SET x =1, fn_freq = 0; 
     WHILE x < 8 DO 
      IF MID(days, x, 1) <> '_' THEN 
       SET fn_freq = fn_freq + 1; 
      END IF; 
      SET x = x + 1; 
     END WHILE; 
    RETURN fn_freq; 
END$$ 
DELIMITER ;