mysql 存储过程
mysql 存储过程
eddy_linux 发表于2年前
mysql 存储过程
  • 发表于 2年前
  • 阅读 9
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

 /*
过程:封装了若干条语句,调用时这个封装体集中执行
函数:是一个有返回值的“过程”
过程是没有返回值的函数
存储过程:把若干条sql语句封装起来,起个名字----过程
把此过程存储在数据库中----存储过程
存储过程的语法
create procedure procedurename()
begin
sql语句
end;
*/
#1 创建基本的procedure
delimiter $
create procedure p1()
begin
select ('hello') from dual;
end$
#查看procedure
show procedure  status;
#调用procedure
call p1();
 mysql> call p1();
+-------+
| hello |
+-------+
| hello |
+-------+
1 row in set
Query OK, 0 rows affected
#存储过程中是可以编程的,可以使用变量、表达式、控制结构来完成复杂的功能
#在存储过程中使用declare声明变量
#--declare 变量名 变量类型 【default 默认值】
#2 设置变量
delimiter $
create procedure p2()
begin
	declare age int default 18;
	declare height int default 180;
	select concat('年龄:',age,'身高:',height);
end$
#删除procedure
drop procedure p2;
call p2();
mysql> call p2
();
+------------------------------------+
| concat('年龄:',age,'身高:',height) |
+------------------------------------+
| 年龄:18身高:180                    |
+------------------------------------+
1 row in set
Query OK, 0 rows affected
#3 运算
delimiter $
create procedure p3()
begin
	declare age int default 18;
	set age := age + 20;
	#declare height int default 180;
	select concat('20年后年龄:', age);
end$
call p3();
mysql> call p3
();
+----------------------------+
| concat('20年后年龄:', age) |
+----------------------------+
| 20年后年龄:38              |
+----------------------------+
1 row in set
Query OK, 0 rows affected
 
# 控制if--else
#if condition then
#statement
#else
#end;
delimiter $
create procedure p4()
begin
	declare age int default 18;
	if age >= 18 then
		select '成年人';
	else
		select '未成年';
	end if;
end$
call p4();
mysql> call p4
();
+--------+
| 成年人 |
+--------+
| 成年人 |
+--------+
1 row in set
Query OK, 0 rows affected

 
#传参
#存储过程()可以声明参数
#【in/out/inout】 参数名  参数类型
delimiter $
create procedure p5(width int,height int)
begin
	select concat('面积:',width * height) as area;
	if width > height then
		select '胖';
	elseif	width < height then
		select '瘦';
	else
		select '方';
	end if;
end$
mysql> call p5(2,1
);
+--------+
| area   |
+--------+
| 面积:2 |
+--------+
1 row in set
+----+
| 胖 |
+----+
| 胖 |
+----+
1 row in set
Query OK, 0 rows affected
mysql> call p5(2,3
);
+--------+
| area   |
+--------+
| 面积:6 |
+--------+
1 row in set
+----+
| 瘦 |
+----+
| 瘦 |
+----+
1 row in set
Query OK, 0 rows affected
mysql> call p5(3
,3);
+--------+
| area   |
+--------+
| 面积:9 |
+--------+
1 row in set
+----+
| 方 |
+----+
| 方 |
+----+
1 row in set
Query OK, 0 rows affected
#控制结构
#顺序、选择、循环
#求1-100的和
delimiter $
create procedure p6()
begin
	declare total int default 0;
	declare num int default 0;
	
	while num <= 100 do
		set total := total + num;
		set num := num + 1;
	end while;
	select total;
end$
call p6();
mysql> call p6(
);
+-------+
| total |
+-------+
|  5050 |
+-------+
1 row in set
Query OK, 0 rows affected
 
#求1-n的和,in表示参数传到存储过程中
delimiter $
create procedure p7(in n int)
begin
	declare total int default 0;
	declare num int default 0;
	
	while num <= n do
		set total := total + num;
		set num := num + 1;
	end while;
	select total;
end$
call p7(100);
 
mysql> call p7(100
);
+-------+
| total |
+-------+
|  5050 |
+-------+
1 row in set
Query OK, 0 rows affected
 
#out 往外输出
delimiter $
create procedure p8(in n int,out total int)
begin
	declare num int default 0;
	set total := 0;
	while num < n do
		set num := num + 1;
		set total := total + num;
	end while;
end$
mysql> call p8(100,@sumary);
Query OK, 0 rows affected
mysql> select @sumary;
+---------+
| @sumary |
+---------+
|    5050 |
+---------+
1 row in set
#inout
set @curage = 18;
delimiter $
create procedure p9(inout age int)
begin
	set age := age + 20;
	
end$
mysql> set @curage = 18;
Query OK, 0 rows affected
mysql> call p9(@curage);
Query OK, 0 rows affected
mysql> select @curage;
+---------+
| @curage |
+---------+
|      38 |
+---------+
1 row in set


共有 人打赏支持
粉丝 19
博文 132
码字总数 185568
×
eddy_linux
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: