mysql 在创建存储过程和函数的时候
开头要加 delimiter //
结尾要加 // delimiter ;
下面是为了构造测试数据写的一个查询用户信息的存储过程和生产中文姓名的函数
delimiter // # 定义//为一句sql的结束标志,取消;的所代表的意义
drop procedure if exists insert_ggxx; # 如果存在名字为test的procedure则删除
create procedure insert_ggxx() # 创建(创建函数使用的关键字为function 函数名())
begin
declare old_pro VARCHAR(255); # 声明变量
declare flag int default 0;
# 这是重点,定义一个游标来记录sql查询的结果(此处的知识点还有SQL的模糊查询,见补充)
declare s_list cursor for SELECT x.GSXX_ID from sx_gsxx x;
# 为下面while循环建立一个退出标志,当游标遍历完后将flag的值设置为1
declare continue handler for not found set flag=1;
open s_list; # 打开游标
# 将游标中的值赋给定义好的变量,实现for循环的要点
fetch s_list into old_pro;
while flag <> 1 do
# 产生一个随机数用来控制插入的条数
SET @num = round(RAND()*6,0);
SET @i = 0;
while @i <= @num do
insert into sx_zyry(NAME,POSITION,GSXX_ID,ISDEL,ZYRY_ID) values
(rand_name(1), round(RAND()*6,0), old_pro,'0',UUID());
SET @i = @i + 1;
end while;
# 游标往后移(此处的游标是不是让你想起了C里面的指针)
fetch s_list into old_pro;
end while;
#select * from temp_table;
close s_list; # 关闭游标
end
//
delimiter ; # 重新定义;为一句sql的结束标志,取消//的所代表的意义
call insert_ggxx(); # 调用
rand_name(int n)函数,其中n代表的返回几个姓名,一般是1
# 首先授权给MySQL允许自定义创建函数
set global log_bin_trust_function_creators = 1;
delimiter $$
DROP FUNCTION if EXISTS rand_name;
create function rand_name(n int) returns VARCHAR(255)
begin
-- 初始化一个16姓氏字符串,作为姓氏字符库
declare family_str VARCHAR (2056) default '赵钱孙李周郑王冯陈楮卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮齐康伍余元卜顾孟平黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁杜阮蓝闽席季麻强贾路娄危江童颜郭梅盛林刁锺徐丘骆高夏蔡田樊胡凌霍虞万支柯昝管卢莫经裘缪干解应宗丁宣贲邓郁单杭洪包诸左石崔吉钮龚程嵇邢滑裴陆荣翁';
-- 初始化一个32名字字符串,作为名字字符库
declare name_str VARCHAR (2056) default '嘉懿煜城懿轩烨伟苑博伟泽熠彤鸿煊博涛烨霖烨华煜祺智宸正豪昊然明杰诚立轩立辉峻熙弘文熠彤鸿煊烨霖哲瀚鑫鹏致远俊驰雨泽烨磊晟睿天佑文昊修洁黎昕远航旭尧鸿涛伟祺轩越泽浩宇瑾瑜皓轩擎苍擎宇志泽睿渊楷瑞轩弘文哲瀚雨泽鑫磊梦琪忆之桃慕青问兰尔岚元香初夏沛菡傲珊曼文乐菱痴珊恨玉惜文香寒新柔语蓉海安夜蓉涵柏水桃醉蓝春儿语琴从彤傲晴语兰又菱碧彤元霜怜梦紫寒妙彤曼易南莲紫翠雨寒易烟如萱若南寻真晓亦向珊慕灵以蕊寻雁映易雪柳孤岚笑霜海云凝天沛珊寒云冰旋宛儿绿真盼儿晓霜碧凡夏菡曼香若烟半梦雅绿冰蓝灵槐平安书翠翠风香巧代云梦曼幼翠友巧听寒梦柏醉易访旋亦玉凌萱访卉怀亦笑蓝春翠靖柏夜蕾冰夏梦松书雪乐枫念薇靖雁寻春恨山从寒忆香觅波静曼凡旋以亦念露芷蕾千兰新波代真新蕾雁玉冷卉紫山千琴恨天傲芙盼山怀蝶冰兰山柏翠萱乐丹翠柔谷山之瑶冰露尔珍谷雪乐萱涵菡海莲傲蕾青槐冬儿易梦惜雪宛海之柔夏青亦瑶妙菡春竹修杰伟诚建辉晋鹏天磊绍辉泽洋明轩健柏煊昊强伟宸博超君浩子骞明辉鹏涛炎彬鹤轩越彬风华靖琪明诚高格光华国源宇晗昱涵润翰飞翰海昊乾浩博和安弘博鸿朗华奥华灿嘉慕坚秉建明金鑫锦程瑾瑜鹏经赋景同靖琪君昊俊明季同开济凯安康成乐语力勤良哲理群茂彦敏博明达朋义彭泽鹏举濮存溥心璞瑜浦泽奇邃祥荣轩';
-- 记录当前是第几个
declare i int default 0;
-- 记录生成结果
declare full_name varchar(16) default '';
-- 随机名字1、2位标记
declare rand_num int DEFAULT 0;
while i < n do
-- 若获取多个姓名,则用逗号','区分
set full_name = if(i > 0, concat(full_name, ','), full_name);
-- 随机取姓氏
set full_name = concat(full_name, SUBSTR(family_str, floor(1+rand()*16), 1));
-- 随机取名字
set full_name = concat(full_name, SUBSTR(name_str, floor(1+rand()*16), 1));
-- 名字是否为双字
set rand_num = rand()*10;
set full_name = if(rand_num > 5, concat(full_name, SUBSTR(name_str, floor(1+rand()*16), 1)), full_name);
set i = i + 1;
end while;
return full_name;
end$$
delimiter ;