存储过程调用:
call proc1(1000000,’000001’,2,2,23,2,3,2,2);
下面的代码可以查看执行笑话时间
set @t = UNIX_TIMESTAMP();
call proc1(1000000,’000001’,2,2,23,2,3,2,2);
select @t, UNIX_TIMESTAMP() as t;
存储过程创建:
DROP PROCEDURE IF EXISTS proc1;
DELIMITER //
CREATE PROCEDURE proc1(
IN totalnum int(6), #生成库存数量
IN businessid char(32), #商户id
IN goodsid char(32), #商品id
IN credence varchar(50),#商品编号
IN endtime int(10), #有效期
IN price decimal(10), #成本价
IN nowmaxnum int, #目前最大数
IN users varchar(15), #操作人
IN ip varchar(15) #ip地址
)
top:
BEGIN
if totalnum > 100000 THEN #如果生成总数大于10w直接跳出存储过程
leave top;
end if;
DECLARE credenceno varchar(50); #定义商品编号
DECLARE createtime varchar(50) DEFAULT UNIX_TIMESTAMP(); #当前时间
DECLARE storageid char(32); #库存id
DECLARE validatecode char(20); #验证码
DECLARE piececode char(20); #编号
DECLARE sqltext longtext;
DECLARE sqltext1 VARCHAR(1000);
DECLARE sqltext2 longtext;
DECLARE maxwhilenum int default 500; #内部循环的最大值,目前最大值5k多不到1w,太大_CONCAT函数会报错,
DECLARE num int; #内循环变量声明
set sqltext1 =’INSERT INTO xhhk_storage (storageID,businessid,goodsid,credenceno,validatecode,piececode,price,CREATION_DATE,storagestatus,endtime,CREATED_BY,LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_IP,VERSIONs) VALUES ‘;
while (totalnum>0) do
set num = maxwhilenum; #获取本次循环内部循环最大次数
if totalnum < maxwhilenum then
set num = totalnum;
end if;
set sqltext2 = ‘’; #设置语句为空
while (num>0) do
set credenceno = CONCAT(credence,LPAD ((nowmaxnum+num) ,6 ,0));
set storageid = replace(uuid(),’-‘,’’);
set validatecode = rand_string(6); #_left(storageid,6);更快速获得随机值,直接截取uuid的生成数,这种方法生成1w个快4秒,不过虽然不相同但是都很相似
set piececode = rand_string(10); #_left(storageid,10);
set sqltext2 = CONCAT(sqltext2,”,(‘“,storageid,”‘,’”,businessid,”‘,’”,goodsid,”‘,’”,credenceno,”‘,’”,validatecode,”‘,’”,piececode,”‘,’”,price,”‘,’”,createtime,”‘,’”,0,”‘,”,endtime,”,’”,users,”‘,’”,users,”‘,’”,createtime,”‘,’”,ip,”‘,”,1,”)”);
set num = num-1;
end while;
set sqltext = CONCAT(sqltext1,substring(sqltext2,2)); #生成总执行的_sql语句
set @sqltext = sqltext; #这一步很重要,下一话_PREPARE的语句只接受@的变量所以要转换一下
PREPARE SQLStr1 FROM @sqltext; #准备语句
EXECUTE SQLStr1; #执行语句
DEALLOCATE PREPARE SQLStr1; #注销变量
set totalnum = totalnum - maxwhilenum; #总数减去本次循环数
set nowmaxnum = nowmaxnum + maxwhilenum; #下一个编号起始好加上循环值
end while;
END //
DELIMITER ;
随机字符串函数创建:
(转:http://hi.baidu.com/microji/item/15a1933a208ea04a023edc03)
DROP FUNCTION IF EXISTS rand_string;
DELIMITER
CREATE FUNCTION rand_string(n INT)
RETURNS VARCHAR(255)
BEGIN
DECLARE chars_str varchar(100) DEFAULT ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789’;
DECLARE return_str varchar(255) DEFAULT ‘’;
DECLARE i INT DEFAULT 0;
WHILE i < n DO
SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1));
SET i = i +1;
END WHILE;
RETURN return_str;
END
DELIMITER $$
