本文共 6658 字,大约阅读时间需要 22 分钟。
create function function_name ([parameter datatype[, ...]]) returns return_datatype [[not] deterministic]begin -- 函数的逻辑代码 -- 可以包含多条sql语句 return result_valuesend;
语法解释
第一行create function关键字后是指定的自定义函数名称和可选变量。
第二行为返回值的数据类型,可以是任何Mysql的有效类型。
第三行表示函数是否是确定性的,默认为非确定性。确定性函数是指在给定相同的输入参数时,总是返回相同的结果。
最后begin … end中间为函数的逻辑代码,可包含多条sql语句,直到return 返回值后,才会立即终止存储函数的执行。
declare <变量名> <变量类型> default <默认值> ;set <变量名> = <值> ; 值> 变量名> 默认值> 变量类型> 变量名>
show function status;-- 查看所有的自定义函数show create function <自定义函数名> ;-- 查看指定自定义函数 自定义函数名>
删除是必修课,在任何一个中都必须学习创建和删除,语法如下:
drop function [if exists] <自定义函数名> ; 自定义函数名>
使用自定义函数和平时使用的一样,正常调用就行。
# 自定义加法函数create function two_add(a int, b int) returns int deterministicbegin declare result int; set result = a + b; return result;end;# 使用自定义的加法函数select two_add(3,3);+--------------+| two_add(3,3) |+--------------+| 6 |+--------------+select a, b, two_add(a, b) as cfrom (select 2 as a, 3 as b union all select 6 as a, 8 as b) as t1;+---+---+------+| a | b | c |+---+---+------+| 2 | 3 | 5 || 6 | 8 | 14 |+---+---+------+
分支结构:if 和 case 语句
# if 分支语法if 表达式1 then 操作1;[elseif 表达式2 then 操作2;]...[else 操作n;]end if;# case 分支语法1case 表达式when 值1 then 操作1;when 值2 then 操作2;...else 操作nend case;# case 分支语法2casewhen 条件1 then 操作1;when 条件2 then 操作2;...else 操作n;end case;
分支结构和select中的有点相似,只不过结尾要加if
或者case
,并且每一个操作后面都要分号。
循环结构:loop
、while
和 repeat
语句
在这里只介绍while的用法,while在执行语句执行时,先对指定的表达式进行判断,如果为真,就执行循环内的语句,否则退出循环。
# 语法1while 循环条件 do 循环体 操作语句 end while;
跳转语句:iterate
和leave
语句
[while_label:] while 循环条件 do 循环体 操作语句 iterate while_label leave while_label end while;
# 定义是否偶数函数,返回布尔值1或0create function is_even(num int) returns boolean deterministicbegin declare even boolean; if num % 2 = 0 then set even = true; else set even = false; end if; return even;end;# 调用select is_even(6) as a,is_even(13) as b;+------+------+| a | b |+------+------+| 1 | 0 |+------+------+
# 定义函数create function customerlevel(credit decimal(10, 2)) returns varchar(20) deterministicbegin declare level varchar(20); if credit > 50000 then set level = 'platinum'; elseif (credit <= 50000 and credit >= 10000) then set level = 'gold'; elseif credit < 10000 then set level = 'silver'; end if; return level;end;# 调用select a,customerlevel(a) as bfrom(select floor(rand()*50000)+10000 as aunion allselect floor(rand()*50000)+50000 as aunion allselect floor(rand()*10000) as a) as t1;+-------+----------+| a | b |+-------+----------+| 53753 | platinum || 62311 | platinum || 6059 | silver |+-------+----------+
# 定义create function generatename() returns varchar(3) charset utf8 deterministicbegin declare frist varchar(2056) default '赵钱孙李周郑王冯陈楮卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮齐康伍余元卜顾孟平黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁杜阮蓝闽席季麻强贾路娄危江童颜郭梅盛林刁锺徐丘骆高夏蔡田樊胡凌霍虞万支柯昝管卢莫经裘缪干解应宗丁宣贲邓郁单杭洪包诸左石崔吉钮龚程嵇邢滑裴陆荣翁'; declare last varchar(2056) default '嘉懿煜城懿轩烨伟苑博伟泽熠彤鸿煊博涛烨霖烨华煜祺智宸正豪昊然明杰诚立轩立辉峻熙弘文熠彤鸿煊烨霖哲瀚鑫鹏致远俊驰雨泽烨磊晟睿天佑文昊修洁黎昕远航旭尧鸿涛伟祺轩越泽浩宇瑾瑜皓轩擎苍擎宇志泽睿渊楷瑞轩弘文哲瀚雨泽鑫磊梦琪忆之桃慕青问兰尔岚元香初夏沛菡傲珊曼文乐菱痴珊恨玉惜文香寒新柔语蓉海安夜蓉涵柏水桃醉蓝春儿语琴从彤傲晴语兰又菱碧彤元霜怜梦紫寒妙彤曼易南莲紫翠雨寒易烟如萱若南寻真晓亦向珊慕灵以蕊寻雁映易雪柳孤岚笑霜海云凝天沛珊寒云冰旋宛儿绿真盼儿晓霜碧凡夏菡曼香若烟半梦雅绿冰蓝灵槐平安书翠翠风香巧代云梦曼幼翠友巧听寒梦柏醉易访旋亦玉凌萱访卉怀亦笑蓝春翠靖柏夜蕾冰夏梦松书雪乐枫念薇靖雁寻春恨山从寒忆香觅波静曼凡旋以亦念露芷蕾千兰新波代真新蕾雁玉冷卉紫山千琴恨天傲芙盼山怀蝶冰兰山柏翠萱乐丹翠柔谷山之瑶冰露尔珍谷雪乐萱涵菡海莲傲蕾青槐冬儿易梦惜雪宛海之柔夏青亦瑶妙菡春竹修杰伟诚建辉晋鹏天磊绍辉泽洋明轩健柏煊昊强伟宸博超君浩子骞明辉鹏涛炎彬鹤轩越彬风华靖琪明诚高格光华国源宇晗昱涵润翰飞翰海昊乾浩博和安弘博鸿朗华奥华灿嘉慕坚秉建明金鑫锦程瑾瑜鹏经赋景同靖琪君昊俊明季同开济凯安康成乐语力勤良哲理群茂彦敏博明达朋义彭泽鹏举濮存溥心璞瑜浦泽奇邃祥荣轩'; declare frist_num int default length(frist) / 3; declare last_num int default length(last) / 3; declare return_str varchar(255) default ''; set return_str = concat(return_str, substring(frist, floor(1 + rand() * frist_num), 1)); set return_str = concat(return_str, substring(last, floor(1 + rand() * last_num), 1)); set return_str = concat(return_str, substring(last, floor(1 + rand() * last_num), 1)); return return_str;end;# 调用select generatename();+----------------+| generatename() |+----------------+| 丁辉寒 |+----------------+
可以将第一个return_str固定为指定的姓,剩下的两位随机生成,还有如果要生成四位的姓名,可以再加一个 return_str 变量,这样就可以随机给娃取名了。
# 定义create function generatephone() returns char(11) charset utf8 deterministicbegin declare front varchar(100) default '000,156,136,176,183,157,150'; declare behind char(10) default '0123456789'; declare phone char(11) default substring(front, 1 + (floor((rand() * 6)) * 4), 3); -- 从1开始 4n+1 共6次 declare i int default 1; declare len int default length(behind);-- 记录后面号码长度 while i <= 8 do set i = i + 1; set phone = concat(phone, substring(behind, floor(1 + rand() * len), 1));-- 合并前面取到的号码,根据后面号码一位位取并合并,满足8位后跳出 end while; return phone;end;# 调用select generatephone();+-----------------+| generatephone() |+-----------------+| 15663636107 |+-----------------+
# 定义create function generatepwd(n int) returns varchar(255) charset utf8 deterministicbegin 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;# 调用select generatepwd(30);+--------------------------------+| generatepwd(30) |+--------------------------------+| podmtwtsrfq5lljmhevmxjwxxzuqgs |+--------------------------------+select a,generatepwd(30) as bfrom(select 1 as aunion allselect 2 as aunion allselect 3 as a) as t1;+---+--------------------------------+| a | b |+---+--------------------------------+| 1 | ph16j7rgwvzaw2dnahlnx7qhni3zbq || 2 | jrcepatj3taxaooobizz08w0iirbqn || 3 | uabfzvmxgjbuzz39rcynaimtwuwipt |+---+--------------------------------+
转载地址:http://qbbfk.baihongyu.com/