Mysql高级——存储过程和函数

一、什么是存储过程和函数

存储过程和函数是事先经过编译 并存储在数据库中的一段sql语句的集合,调用存储过程和函数可以简化开发人员的许多工作,减少数据在数据库和应用服务之间的传输,对于提高数据处理效率是有好处的。(现在已经不推荐使用,面试会问到。)

存储过程和函数的区别在于,一个又返回值,一个没有。

  • 存储过程:是一个没有返回值的函数。

  • 函数:是一个有返回值的过程。

二、创建存储过程

书写格式:

create procedure procedure_name(in/out param ...)
begin
		---sql语句
end;
  • in/out定义是输入参数还是传出函数。不写的话默认in。

– 给变量重新赋值
select concat(“user表中的记录数num=”,num) from sys_user;
end

1.设置输入参数

例如:我们写一个简单的存储过程,要求是传入一个值 身高,根据身高大小返回 相应的身材类型。

create procedure test5(in height int )

BEGIN
		-- 声明一个变量  并给默认值 
		-- 
		DECLARE height int DEFAULT 180;
		DECLARE description VARCHAR(20) DEFAULT '';

		if 
		height > 180 then set description='高个子';
		ELSEIF 
		height <= 180 and height > 160 then set description='中等个子';
		else 
		set description='矮个子';
		end if;
-- 给变量重新赋值
	select concat("身高=",height,'是一个',description);
end;

-- 调用存储过程
call test01(155 )
  1. 使用 in height int 定义一个输入参数。
  2. 申明一个变量基本语法:DECLARE XXX 参数类型 (DEFAULT 默认值可有可无)
    如: DECLARE height int DEFAULT 180;
  3. IF判断语法:IF 条件 THEN SQL语句 ELSEIF SQL语句 ELSE SQL语句 END IF;
    注意 每个SQL语句后面都得有;结束,最后END IF 后面也得有 ;.
  4. 给变量赋值 使用 :set XXX = ??;
  5. 调用存储过程:call procedure_name();
    我们调用一下:

在这里插入图片描述

2.设置输出参数

将前面的存储过程改造一下,有两个参数,分别是 in 和 out 修饰,height代表输入参数身高,description 代表输出参数内容。

create PROCEDURE test6( in height int  ,out description VARCHAR(50))
BEGIN
		-- 声明一个变量  并给默认值 
		-- 

		if 
		height > 180 then set description='高个子';
		ELSEIF 
		height <= 180 and height > 160 then set description='中等个子';
		else 
		set description='矮个子';
		end if;
end;

call test6(188,@description);

select @description;

  1. in height int 输入参数
  2. out description VARCHAR(50) 删除函数。
  3. call test6(188,@description);在调用存储过程时,输出函数,使用@变量名
  4. select @description; 获取输出参数,也是使用@变量名
    在这里插入图片描述
    传入188,返回高个子。
3.case when 语句

根据输入月份判断是第几季度。

create PROCEDURE test_7(in  mont int)
BEGIN
	-- 可以
	select count(*) into num from sys_user;

	DECLARE result VARCHAR(20);
	case  when mont>=1 and mont <4 
	then  set result ='第一季度' ;
	case when mont>=4 and mont <7 
	then  set result ='第二季度' ;
	case  when mont>=1 and mont <10 
	then  set result ='第三季度' ;

	else  set result ='第四季度' ;
	end case;
select  result;
end;
  • 基本语法:case when 条件SQL then SQL语句 else SQL语句 end case;
  • 可以使用select count(*) into num from sys_user;给 num赋值为sys_user表行数
4.while循环 语句

根据传入数字,将累加结果返回。

create PROCEDURE test8(n int)
BEGIN
	-- 定义初始累加值 为0
	DECLARE total int DEFAULT 0;
	-- 定义累加初始数为1 从1开始
	DECLARE num int default 1;
	-- 一直加到 n为止
	WHILE num<=n do 
	set total = total + num;
	set num = num+1;
	end WHILE;
	select  total;
end;

call test8(100);
  • 基本语法:WHILE 结束条件SQL do SQL语句 end WHILE;
    在这里插入图片描述
5.loop循环 语句

还是给定一个值,返回累加结果;

create PROCEDURE test11(n int)
BEGIN
DECLARE total int DEFAULT 0;
-- 定义loop 循环
c:LOOP
	set total = total+n;
	set n = n-1;
-- 设置跳出循环条件
	if n<=0 THEN
		LEAVE c;
	end if;

end loop;
select total;
end;


call test11(100);
  • 语法:c:LOOP SQL语句 if 跳出循环条件 THEN LEAVE c; end if; end loop;
6.REPEAT循环 语句

给定一张sys_user表,需要往表中插入 20条记录。

CREATE TABLE `sys_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `name` varchar(100) CHARACTER SET utf8 DEFAULT NULL COMMENT '用户名称',
  `password` varchar(20) CHARACTER SET utf8 DEFAULT NULL COMMENT '用户密码',
  `email` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '邮箱',
  `sex` tinyint(4) DEFAULT NULL COMMENT '性别0 女 1男',
  `department_id` int(11) DEFAULT NULL COMMENT '部门id',
  `role_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
create PROCEDURE test10(n int)
BEGIN

REPEAT  
		INSERT INTO `sys_user` (`id`, `name`, `password`, `email`, `sex`, `department_id`, `role_id`) VALUES (n, 'admin', '123456', '952793966@qq.com', '1', '1', '5');
		set n = n-1;
UNTIL n=0
end REPEAT; 
end;

call test10(20);
  • UNTIL n=0 为终止条件。
    在这里插入图片描述

三、创建函数

函数Function的语法和存储过程的语法结构基本类似。
例如:我们现在有一张部门表:需要创建一个函数,去根据传入id获取,部门名称。
在这里插入图片描述

create FUNCTION fun1(inid int)
RETURNS VARCHAR(20)
BEGIN
	DECLARE depname VARCHAR(20);
	select department_name into depname from department where id = inid;

	RETURN depname;
END ;
  • 存储过程是:PROCEDURE 函数是:FUNCTION
  • 需要指定返回值类型:RETURNS VARCHAR(20)
  • 需要return出sql处理结果: RETURN depname;
  • 调用函数直接使用select fun1(5);
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
存储函数和自定义函数是两种不同的概念。引用\[1\]中提到,存储函数是在数据库中创建的一种函数,它必须有一个return子句用于返回函数值,并且可以通过CREATE FUNCTION语句来创建。而自定义函数是指用户自己定义的函数,可以在程序中使用,但不是在数据库中创建的。引用\[2\]中提到,在MySQL中,存储过程函数可以使用CREATE PROCEDURE和CREATE FUNCTION语句来创建,而自定义函数则可以直接在程序中定义。存储过程函数可以通过CALL语句来调用,而自定义函数可以通过函数名来引用。此外,存储过程函数可以有输出参数,可以返回多个值,而自定义函数通常只能返回一个标量值。根据引用\[3\]中的原则,如果只有一个返回值,通常使用存储函数;如果有多个返回值,通常使用存储过程。 #### 引用[.reference_title] - *1* *3* [Oracle数据库——存储过程和自定义函数](https://blog.csdn.net/hyh17808770899/article/details/106867758)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [八、存储过程与自定义函数](https://blog.csdn.net/qq_52059326/article/details/124399461)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值