mysql流程控制案例
#mysql流程控制案例
/*一、已知表stringcontent
其中字段:
id 自增长
content varchar(20)
向该表插入指定个数的,随机的字符串
*/
#切换成girls库
USE girls;
#删除表
DROP TABLE IF EXISTS stringcontent;
#创建表
CREATE TABLE stringcontent(
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(20)
);
#定义一个存储过程
/*
(还有点小bug,当startIndex为21或26等等像这样大的数字的时候,截取长
度可能为0甚至是负数,最终导致插入空值)
*/
DELIMITER $
CREATE PROCEDURE insertRandStr(IN insertCount INT)
BEGIN
DECLARE initCount INT DEFAULT 1; #定义一个循环变量initCount,表示插入的次数
DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
DECLARE startIndex INT DEFAULT 1; #表示起始索引
DECLARE len INT DEFAULT 1; #代表截取的字符长度
tag:WHILE initCount <= insertCount DO
SET startIndex = FLOOR(RAND() * 26 + 1);#代表起始索引,随机范围1-26
#下面这句话还有些小bug
SET len = FLOOR(RAND() * (20 - startIndex + 1) + 1);#代表截取长度,随机范围1-(20-startIndex+1)
INSERT INTO stringcontent(content) VALUES(SUBSTR(str, startIndex, len));
SET initCount = initCount + 1; #循环变量更新
END WHILE tag;
END$
#调用存储过程
CALL insertRandStr(5)$
#
SELECT * FROM stringcontent$
#定义一个存储过程
/*
(还有点小bug,当startIndex为21或26等等像这样大的数字的时候,截取长
度可能为0甚至是负数,最终导致插入空值)
*/
DELIMITER $
CREATE PROCEDURE test_randstr_insert(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
DECLARE startIndex INT;#代表初始索引
DECLARE len INT;#代表截取的字符长度
DECLARE insertStr VARCHAR(20) DEFAULT '';
WHILE i<=insertcount DO
SET startIndex=FLOOR(RAND()*26+1);#代表初始索引,随机范围1-26
#下面这句话还有些小bug
SET len=FLOOR(RAND()*(20-startIndex+1)+1);#代表截取长度,随机范围1-(20-startIndex+1)
SET insertStr = SUBSTR(str,startIndex,len);
SELECT startIndex AS "起始索引", len AS "截取长度", insertStr AS "要插入的字符";
INSERT INTO stringcontent(content) VALUES(insertStr);
SET i=i+1;
END WHILE;
END $
#调用存储过程
CALL test_randstr_insert(6)$
#清空表
TRUNCATE TABLE stringcontent$
#
SELECT * FROM stringcontent$
#
SELECT 20 - 25 + 1;
SELECT RAND() * (20 - 25 + 1);
SELECT (RAND() * (20 - 25 + 1) + 1);
SELECT FLOOR(RAND() * (20 - 25 + 1) + 1);
#
/*
注意:
在mysql的trigger和function中不能出
现select * from table;或select 字段1, 字段2, 字段3 from table;等等形式的查
询,因为其会返回一个结果集;而这在mysql的trigger和function中是不可接
受的,但是在存储过程中可以。在trigger和function中可以使
用select ... into ...形式的查询
*/
#定义一个函数,返回一个随机字符串
DELIMITER $
CREATE FUNCTION getRandstr() RETURNS VARCHAR(20)
BEGIN
DECLARE randStr VARCHAR(20) DEFAULT ''; #随机字符串
DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
DECLARE startIndex INT; #代表初始索引
DECLARE len INT; #代表截取的字符长度
SET startIndex = FLOOR(RAND() * 26 + 1); #代表初始索引,随机范围1-26
#下面这句话还有些小bug
SET len = FLOOR(RAND() * (20 - startIndex + 1) + 1); #代表截取长度,随机范围1-(20-startIndex+1)
SET randStr = SUBSTR(str, startIndex, len);
#定义函数时,不能在函数体中出现如下语句或类似的语句,但可以使用select...into...形式的查询
#SELECT startIndex AS "起始索引", len AS "截取长度", randStr AS "要插入的字符";
RETURN randStr;
END$
#调用函数
SELECT getRandstr()$
#定义一个存储过程(存储过程中调用自定义的getRandstr()函数)
DELIMITER $
CREATE PROCEDURE insertRandStr2(IN insertCount INT)
BEGIN
DECLARE initCount INT DEFAULT 1; #定义一个循环变量initCount,表示插入的次数
tag:WHILE initCount <= insertCount DO
#调用自定义的getRandstr()函数
INSERT INTO stringcontent(content) VALUES(getRandstr());
SET initCount = initCount + 1; #循环变量更新
END WHILE tag;
END$
#调用存储过程
CALL insertRandStr2(10)$
#
SELECT * FROM stringcontent$
#清空表
TRUNCATE TABLE stringcontent$
#mysql自定义函数,生成n个字符长度的随机字符串
DELIMITER $
CREATE FUNCTION rand_str(n INT) RETURNS VARCHAR(255)
BEGIN
DECLARE str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSQUVWXYZ';
DECLARE i INT DEFAULT 0;
DECLARE res_str VARCHAR(255) DEFAULT '';
WHILE i < n DO
SET res_str = CONCAT(res_str,SUBSTR(str,FLOOR(RAND()*52+1),1));
SET i = i + 1;
END WHILE;
RETURN res_str;
END$
#调用函数
SELECT rand_str(3)$ #生成3个字符的随机字母
SELECT rand_str(18)$ #生成18个字符的随机字母
SELECT rand_str(5)$ #生成5个字符的随机字母
#生成3个字符的随机字母
SELECT rand_str(3) AS "随机字符串", LENGTH(rand_str(3)) AS 长度$
#生成18个字符的随机字母
SELECT rand_str(18) AS "随机字符串", LENGTH(rand_str(18)) AS 长度$
#生成5个字符的随机字母
SELECT rand_str(5) AS "随机字符串", LENGTH(rand_str(5)) AS 长度$