我正在构建一系列过程,我必须在其中几乎所有过程和多个列中插入通用名称。
所以我想创建一个程序来为我生成“文本”。文本的代码是这样的:
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));
外部链接:
- 我看到可以从这里的另一个过程调用一个过程“Calling a Stored Procedure in a Stored Procedure in MySQL”
最佳答案
问题#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/