mysql流程控制案例

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 长度$

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值