MySQL局部变量值意外更改

时间:2020-01-05 06:06:32

标签: mysql stored-procedures

我有一张桌子,上面有以下原型:

CREATE TABLE `T2` (
`ID` int(11) DEFAULT NULL,
`NAME` varchar(100) DEFAULT NULL
)

我想创建过程以插入具有特定长度的随机字符串,并编写了以下内容:

DELIMITER ;;
CREATE PROCEDURE STRGEN ( IN ITER INT) BEGIN
    DECLARE COUNTER INT DEFAULT 0;
    DECLARE _STR VARCHAR(1000) DEFAULT NULL;

    WHILE COUNTER < @ITER DO
        SET _STR = CONCAT(_STR , CHAR(RAND()*100+65));
        SET COUNTER = COUNTER + 1;
    END WHILE;

    INSERT INTO T2 VALUES(RAND()*100 , _STR);
END;;

并这样称呼:

CALL STRGEN(100);

问题在于它会插入NULL作为NAME字段。
我的怀疑是,当while循环终止时,对_STR所做的更改超出了范围。

我还尝试过使用如下所示的全局变量:

CREATE PROCEDURE STRGEN ( IN ITER INT) BEGIN
DECLARE COUNTER INT DEFAULT 0;
DECLARE _STR VARCHAR(1000) DEFAULT NULL;

SET @S = NULL;

WHILE (COUNTER < @ITER) DO
    SET _STR = CONCAT(_STR , CHAR(RAND()*100+65));
    SET COUNTER = COUNTER + 1;
    SET @S = _STR;
END WHILE;
INSERT INTO T2 VALUES(RAND()*100 , @S);
END;;

还要在过程之外声明@S,但没有发生任何特殊情况。

任何帮助表示赞赏。
最好的问候。

1 个答案:

答案 0 :(得分:1)

当我尝试运行您的过程时,出现以下错误:

错误代码:1366。列“ _STR”的字符串值不正确:“ \ x87” 行1 0.000秒

似乎您没有生成有效的字符...我尝试了不同的字符生成器逻辑,它可以按预期工作。

DELIMITER ;;
CREATE PROCEDURE STRGEN ( IN ITER INT) BEGIN
    DECLARE COUNTER INT DEFAULT 0;
    DECLARE _STR VARCHAR(1000) DEFAULT ''; -- change the initial value to ''

    WHILE COUNTER < @ITER DO
        -- SET _STR = CONCAT(_STR , CHAR(RAND()*100+65));

        -- if I change the logic for generating random char, then I get expected result
        SET _STR = CONCAT(_STR , LEFT(MD5(RAND()), 1));
        SET COUNTER = COUNTER + 1;
    END WHILE;

    INSERT INTO T2 VALUES(RAND()*100 , _STR);
END;;