我有一张桌子,上面有以下原型:
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
,但没有发生任何特殊情况。
任何帮助表示赞赏。
最好的问候。
答案 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;;