MySQL存储过程

存储过程和存储函数概述

存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程和函数可以简化程序开发的很多工作,减少数据在数据库和应用服务器之间的传输,对于提交数据处理的效率是有好处的

存储过程和函数的区别在于函数必须有返回值,而存储过程没有
函数:是一个有返回值的过程
过程:是一个没有返回值的函数

1.创建存储过程

DELIMITER $		--修改分隔符语法

CREATE PROCEDURE test1()	--存储过程名称
BEGIN
			SELECT * from city; --SQL语句体
END 

调用存储过程

CALL test1();

在这里插入图片描述
查看存储过程

SELECT name FROM mysql.proc where db='demo_01'; --数据库名称

在这里插入图片描述
查看存储过程的状态信息

-- 查看存储过程的状态信息
SHOW PROCEDURE STATUS;

在这里插入图片描述
查看某个存储过程的定义

SHOW CREATE PROCEDURE test1;

在这里插入图片描述
删除存储过程

DROP PROCEDURE test1;

2.存储过程语法结构
变量

-- 声明变量语法
-- DECLARE 变量名 类型  默认值
CREATE PROCEDURE test2()
BEGIN
			DECLARE num int DEFAULT 10;
			SELECT num + 10 ;
END

call test2; --输出20

赋值

-- 赋值  SET
CREATE PROCEDURE test3()
BEGIN
			DECLARE num int DEFAULT 10;
			SET num = num+10;
			SELECT num ;
END

call test3;   --输出20
-- 赋值  select.....into
CREATE PROCEDURE test4()
BEGIN
			DECLARE num int;
			SELECT count(*) into num from city;--将city记录数赋值给num
			SELECT concat('num的值为:', num) ;
END

call test4;

if条件判断

-- 需求:根据定义的身高数量,判断当前身高的所属身材类型
-- 180及以上  身材高挑
-- 170-180  标准身材
-- 170以下  一般身材

CREATE PROCEDURE test5()
BEGIN
			DECLARE height int default 175;
			DECLARE description VARCHAR(30) DEFAULT '';
			if height >= 180 then --if判断,满足就执行下方的sql语句
			SET description='身材高挑';
			ELSEIF description >= 170 and description < 180 then 
			SET description='标准身材';
			ELSE
			set description='一般身材';
			end if;
			SELECT height,description;
END

call test5;


参数输入

语法格式:
CREATE PROCEDURE 存储过程名称([in/out/inout] 参数名 参数类型)
....

in:该参数可以作为默认,也就是需要调用存储过程时传参
out:该参数作为输出,也就是可以作为返回值
inout:既可以作为输入参数,也可以作为输出参数

in

-- 需求:根据输入的身高数量,判断当前身高的所属身材类型
-- 180及以上  身材高挑
-- 170-180  标准身材
-- 170以下  一般身材

CREATE PROCEDURE test6(in height int)
BEGIN
			DECLARE description VARCHAR(30) DEFAULT '';
			if height >= 180 then 
			SET description='身材高挑';
			ELSEIF description >= 170 and description < 180 then 
			SET description='标准身材';
			ELSE
			set description='一般身材';
			end if;
			SELECT height,description;
END

call test6(200);

out

-- 需求:根据输入的身高数量,判断当前身高的所属身材类型(返回值)
-- 180及以上  身材高挑
-- 170-180  标准身材
-- 170以下  一般身材

CREATE PROCEDURE test7(in height int, out description varchar(30))--height是输入的参数,description 是带有返回值的参数
BEGIN
			if height >= 180 then 
			SET description='身材高挑';
			ELSEIF description >= 170 and description < 180 then 
			SET description='标准身材';
			ELSE
			set description='一般身材';
			end if;
END

call test7(168, @description);--使用@定义用户会话变量接收返回值,@@就是系统变量
SELECT @description;--查询返回值

case when语句结构

格式一:
case 列名
			when1 when 选项1
			when2 when 选项2
			else 默认值
end;

需求:根据城市名称设置对应省份
CREATE PROCEDURE test8()
BEGIN
			SELECT city_id,city_name,
			(case city_name 
			when '西安' then '陕西省'
			when '北京' then '北京市'
			when '上海' then '上海市'
			when '深圳' then '广东省'
			when '广州' then '广东省'
			else '未知'
			end ) as province 
from city;
END

call test8()
格式二:
case 
	when 判断条件1 then 选项1
	when 判断条件2 then 选项2
	when 判断条件3 then 选项3
	else 默认值
end;

需求:判断城市名称为NewYork时,返回1,否则0
CREATE PROCEDURE test9()
BEGIN
			select city.city_name,
			(case 
					when city.city_name='NewYork' then 1 ELSE 0 END
       ) as count 
			from city inner join country on city.country_id =  country.country_id;
END

call test9()

while循环

格式:
while 循环条件 DO
	循环体
end while;

需求:while循环插入100条数据
CREATE PROCEDURE test10()
BEGIN
	DECLARE i int default 1;
	DECLARE sum int default 100 ;
	while i <= sum DO
		INSERT INTO `city` (`city_id`, `city_name`, `country_id`) VALUES (null, CONCAT('深圳',i), '3');
		set i = i+1;
		end while	;
END

call test10()

repeat循环

格式:
repeat 
	循环体
	until 退出条件
end repeat;


需求:批量删除100条数据
CREATE PROCEDURE test11()
BEGIN
	DECLARE i int default 1;
	DECLARE sum int default 100 ;

	REPEAT
		
		DELETE from city where city.city_name=CONCAT('深圳',i);
		set i = i+1;
		until i > sum
		end repeat;
	
END

call test11()

loop循环

loop 能实现简单的循环,退出循环的条件需要使用其他的语句定义,通常可以使用leave语句实现
格式:
[begin_lable:]loop  -- begin_lable 循环的别名

	循环体
end loop [end_lable]

需求:批量增加100条数据
CREATE PROCEDURE test12()
BEGIN
	DECLARE i int default 1;
	DECLARE sum int default 100 ;

	c:LOOP  -- 开始循环
		INSERT INTO `city` (`city_id`, `city_name`, `country_id`) VALUES (null, CONCAT('深圳',i), '3');
		set i = i+1; -- 每次累加
		if i > sum then -- 判断条件
			leave c; -- 退出循环
		end if;
	end loop c; -- 结束循环
	
END

call test12()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值