用户自定义函数

自定义函数的语法格式

create function 函数名(参数1  参数类型,参数2  参数类型,...)
-- 参数是形参
return 返回值的数据类型
begin 
	函数体;
	return语句;
end;

--函数的调用
select 函数名(参数);
-- 参数是实参

1.顺序结构

-- 三角形求斜边长
drop FUNCTION  if EXISTS f1;
create FUNCTION f1(a int,b int)
returns DECIMAL(10,1)
BEGIN
DECLARE c DECIMAL(10,1);
set c=SQRT(a*a+b*b);
return c;
END ;

select f1(3,4);
-- 6.1创建一个存储函数,返回某个学生的姓名
drop FUNCTION  if EXISTS NAME_OF_STU;
CREATE FUNCTION NAME_OF_STU(XH CHAR(6))
returns CHAR(8)
BEGIN
RETURN (SELECT 姓名 FROM xsb WHERE 学号=XH); 
END;
select NAME_OF_STU('081102');
-- 6.2 创建一个用户函数fam( ),求任意两整数之和
-- (1)创建存储函数
DROP FUNCTION IF EXISTS fam;
CREATE FUNCTION fam(a int,b int)
RETURNS int  
BEGIN
DECLARE c int;
set c=a+b;
RETURN c;
END;
-- (2)函数的调用
select fam(2,7);
-- 6.3创建一个用户函数sea( ),求任意三角形的面积,S=0.5*a*h
DROP FUNCTION IF EXISTS sea;
CREATE FUNCTION sea(a DECIMAL(8,2),h DECIMAL(8,2))
RETURNS DECIMAL(8,2)
BEGIN
DECLARE s DECIMAL(8,2);
set s=1.0/2*a*h;
return s;
END;

SELECT sea(5.685,3.62);
-- 6.4 函数中利用系统函数解决问题
DROP FUNCTION IF EXISTS sayHello;
CREATE FUNCTION sayHello(user_name VARCHAR(10))
RETURNS VARCHAR(20)
BEGIN
RETURN CONCAT('hello,',user_name);
END;

SELECT sayHello('陈甲');
-- 6.5 建立一自定义函数,能随机产生三字姓名
drop FUNCTION if EXISTS sqname;
CREATE FUNCTION sqname() 
RETURNS char(3)
BEGIN
DECLARE first_name char(16) default'赵钱孙李周吴郑王冯陈诸卫蒋沈韩杨';
DECLARE mid_name char(8) default'大小多少山石土田';
DECLARE last_name char(5) default'甲乙丙丁卯';
DECLARE full_name char(3);
set full_name=concat(
substring(first_name,FLOOR(RAND()*16+1),1),
substring(mid_name,floor(RAND()*8+1),1),
substring(last_name,FLOOR(RAND()*5+1),1)
);
RETURN full_name;
END;

select sqname();
-- 6.6 随机产生四位验证码,验证码由大小写字母和阿拉伯数字组成
drop FUNCTION IF EXISTS yzm;
CREATE FUNCTION yzm() 
RETURNS CHAR(4)
BEGIN
DECLARE first_name char(62) DEFAULT'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE mid_name char(62) DEFAULT'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE third_name char(62) DEFAULT'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE last_name char(62) DEFAULT'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE full_name char(4);
set full_name=concat(
substring(first_name,FLOOR(RAND()*62+1),1),
substring(mid_name,floor(RAND()*62+1),1),
substring(third_name,floor(RAND()*62+1),1),
substring(last_name,FLOOR(RAND()*62+1),1)
);
return full_name;
END;

select yzm();

2—if条件控制语句

-- 6.7利用时间函数和分支结构解决问题
drop FUNCTION if EXISTS ffunc;
CREATE FUNCTION  ffunc()
RETURNS VARCHAR(20)
BEGIN
IF hour(now())>=11 then 
return '晚';
ELSE
RETURN '早';
END IF;
END;

SELECT ffunc();
-- 6.8利用时间函数和if结构嵌套解决问题
DROP FUNCTION IF EXISTS func1;
CREATE FUNCTION  func1() 
RETURNS VARCHAR(20)
BEGIN 
if hour(now())>=17 THEN
RETURN '晚';
ELSE if hour(now())>=9 then
RETURN '中';
else 
RETURN '早';
end if;
end if;
END;

SELECT func1();
-- 6.9利用系统函数和if嵌套解决问题--切割字符串
DROP FUNCTION if EXISTS cutString;
CREATE FUNCTION cutString(s VARCHAR(225),n int)
RETURNS VARCHAR(225)
BEGIN 
IF(ISNULL(s)) then 
RETURN '';
ELSE IF CHAR_LENGTH(s)< n then 
return s;
else if CHAR_LENGTH(S)= n then 
RETURN '相等';
else 
return CONCAT(left(s,n),'sgq123');
end if;
end if;
end if;
END;

SELECT cutString('abcdefghijklmnopqrstuvwxyz',5);

3.case多分支语句

--6.10 利用case语句与函数解决问题--分数等级
drop FUNCTION if EXISTS grade_sw;
create FUNCTION grade_sw(score int)
returns VARCHAR(30)
BEGIN
DECLARE consult int;
DECLARE grade VARCHAR(30);
if (score>=0) 
then set consult = score div 10;
case consult
when 10 THEN
set grade = 'A';
when 9 THEN
set grade = 'A';
when 8 THEN
set grade = 'B';
when 7 THEN
set grade = 'C';
when 6 THEN
set grade = 'D';
when 5 THEN
set grade = 'E';
when 4 THEN
set grade = 'E';
when 3 THEN
set grade = 'E';
when 2 THEN
set grade = 'E';
when 1 THEN
set grade = 'E';
when 0 THEN
set grade = 'E';
ELSE 
SET grade ='Score is error!';
end case;
else 
set grade = 'Score is error!';
END IF;
return grade;
end;

select grade_sw(100);

4.循环语句

-- 6.11自定义函数中使用循环语句。用循环结构编写函数gsd1,求1+2+3+...+99+100的和
DROP FUNCTION IF EXISTS gsd1;
CREATE FUNCTION gsd1(n int)
RETURNS int
BEGIN
DECLARE i int DEFAULT 1;
DECLARE sums int default 0;
while i<=n do 
	set sums=sums+i;
set i=i+1;
end WHILE;
RETURN sums;
END;

SELECT gsd1(100);

show CREATE FUNCTION gsd1;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值