我正在构建一系列程序,我将不得不在几乎所有程序中插入通用名称,并将列倍数。
所以我想创建一个为我生成“文本”的过程。文本的代码是:
SELECT CONCAT( CHAR( FLOOR(65 + (RAND() * 25))));
这会为我生成一个随机字符。所以这是我做的程序:
DELIMITER ;;
CREATE DEFINER=`my_definer`@`localhost` PROCEDURE GenericName(IN NumRows INT,OUT retorno VARCHAR)
BEGIN
DECLARE i INT;
SET i = 1;
SET retorno = "";
WHILE i <= NumRows DO
SET retorno = SELECT CONCAT( CHAR( FLOOR(65 + (RAND() * 25))));
SET i = i + 1;
END WHILE;
END;;
DELIMITER ;
以下错误是我尝试创建过程时出现的错误:
您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 靠近')BEGIN DECLARE i INT; SET i = 1; SET retorno =“”;
根据错误,我认为这是一个愚蠢的事情,但我在创建商店程序方面没有太多专业知识,而且我可能会过度思考。
PS(这是我在完成上述程序时要做的未来用法):想法是通过以下方式在其他程序中调用此过程:
INSERT INTO tbl_a (name, position) VALUES (CALL GenericName(7), CALL GenericName(5));
外部链接:
答案 0 :(得分:1)
您不应该使用存储过程。您应该使用存储函数
在循环中,您忘记在CONCAT中包含retorno
另外,我会改变
CHAR(FLOOR(65 + (RAND() * 25)))
到
CHAR(FLOOR(65.5 + (RAND() * 25)))
给出Z
字母出现的公平机会
替换
SET retorno = SELECT CONCAT(...
与
SET retorno = CONCAT(...
DELIMITER ;;
CREATE DEFINER=`my_definer`@`localhost` FUNCTION GenericName
(NumRows INT)
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
DECLARE i INT;
DECLARE retorno VARCHAR(20);
SET i = 1;
SET retorno = "";
WHILE i <= NumRows DO
SET retorno = CONCAT(retorno,CHAR(FLOOR(65.5 + (RAND() * 25))));
SET i = i + 1;
END WHILE;
RETURN retorno;
END;;
DELIMITER ;
然后,您可以像这样调用INSERT
INSERT INTO tbl_a (name, position) VALUES (GenericName(7),GenericName(5));