存储过程Concat在循环中进行选择

时间:2014-07-25 14:21:17

标签: mysql sql stored-procedures

我正在构建一系列程序,我将不得不在几乎所有程序中插入通用名称,并将列倍数。

所以我想创建一个为我生成“文本”的过程。文本的代码是:

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));

外部链接:

1 个答案:

答案 0 :(得分:1)

问题#1

您不应该使用存储过程。您应该使用存储函数

问题#2

在循环中,您忘记在CONCAT中包含retorno

问题#3

另外,我会改变

CHAR(FLOOR(65 + (RAND() * 25)))

CHAR(FLOOR(65.5 + (RAND() * 25)))

给出Z字母出现的公平机会

问题#4

替换

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));

给它一个尝试!!!