【问题标题】:Store Procedure Concat a select while in a loop存储过程在循环中连接选择
【发布时间】:2014-07-25 14:21:17
【问题描述】:

我正在构建一系列程序,我必须在几乎所有程序中插入通用名称,并在多个列中插入。

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

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 服务器版本,以便使用正确的语法 ') 开始声明 i INT;设置我 = 1; SET retorno = "";

基于错误,我认为这是愚蠢的,但我在创建存储过程方面没有太多专业知识,我可能会想太多。


PS(这是我在完成上述过程后计划做的未来用法):想法是通过以下方式在其他过程中调用此过程:

INSERT INTO tbl_a (name, position) VALUES (CALL GenericName(7), CALL GenericName(5));

外部链接:

【问题讨论】:

  • 最初我试图做类似SET retorno = CONCAT( retorno, SELECT CONCAT( CHAR( FLOOR(65 + (RAND() * 25)))) ); 这样的事情,所以我可以创建一个完整的字符串(我想要多少字符都可以)。但是,我什至没有完成上面的=(

标签: mysql sql stored-procedures


【解决方案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));

试一试!!!

【讨论】:

  • 感谢function 而不是procedure 的建议。我收到以下错误,您发布的代码是:“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以获取在 'SELECT CONCAT(retorno,CHAR( FLOOR) 附近使用的正确语法(65 + (RAND() * 25)))); SET i = i + 1; ' 在第 11 行"。编辑器(sequelPro)突出显示以下代码部分:SELECT CONCAT(retorno,CHAR( FLOOR(65 + (RAND() * 25)))); SET i = i + 1;
  • 感谢您的快速帮助。它说“在 FUNCTION my_definer.GenericName 中找不到返回”,我在 END WHILE; 之后添加了 return retorno; 并且它有效(我使用 SELECT GenericName(7); 进行了测试) PS:再次感谢您的帮助,我学到了很多 根据您的回答,感谢您对社区的大力帮助 =)
  • 对不起,我错过了返回。我刚刚添加了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 2014-05-27
相关资源
最近更新 更多