mysql - 存储过程在循环中连接选择

标签 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 ;

以下是我尝试创建过程时出现的错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') BEGIN DECLARE i INT; SET i = 1; SET retorno = "";

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


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

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

外部链接:

最佳答案

问题#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));

试一试!!!

关于mysql - 存储过程在循环中连接选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24957939/

相关文章:

mysql - SQLite/MySQL 仅在行的时间戳较新时才替换

PHPUnit - 如何在 PHPUnit_Framework_TestCase 中实例化我的 pdo 类?

mysql - 表很大时求每组的最大记录如何优化sql?

sql - 如何解决错误 "no applicable method for ' show_query'应用于类 "data.frame"的对象“

sql - 使用liquibase修改SQL-Server中的数据类型和数据

mysql - 为什么我的带有子查询的 sql 查询速度如此之慢,即使子查询执行得很快?

带有命名参数的 php sqlsrv_query 存储过程

mysql - Coldfusion 存储过程错误

mysql - 在 ubuntu 中授予问题

mysql - 用于组合多个查询输出的存储过程