文章链接:https://codemouse.online/archives/354846877687
存储过程
存储过程和自定义函数是事先经过编译并存储在数据库中的一段SQL语句集合
存储过程参数可以使用 in out inout 函数只能使用in
函数必须要有返回值 存储过程没有返回值
- 无参存储过程
--查找平均花费高的两个客户
create procedure getMaxAvgCost()
begin
select customer,avg(price)
from orders
group by customer
order by avg(price) desc
limit 2;
end;
--调用存储过程
call getMaxAvgCost();
--修改
alter procedure getMaxAvgCost();
--查看存储过程信息
show create procedure getMaxAvgCost;
--删除存储过程
drop procedure getMaxAvgCost;
- 带参存储过程
--获取指定日期最大单笔订单
create procedure getMaxByDate(in odate date)
begin
select customer,max(price)
from orders
where orderdate=odate;
end;
使用:call getmaxbydate('2018-9-21');
--使用存储过程插入数据
create procedure insertTbOrders(
in oid int,in oprice int,in odate date,
in ocus varchar(22))
begin
insert into orders values(oid,oprice,odate,ocus);
select * from orders where id=oid;
end;
call insertTbOrders(8,400,'2018-9-28','danny');
call insertTbOrders(7,200,'2018-9-28','danny');
--删除
create procedure deleteOrders(in oid int)
begin
delete from orders where id=oid;
end;
call deleteOrders(7);
变量
数据在内存中存储可以变化的值或者一个名字
局部变量
声明用declare,可以用default来指定默认值
create procedure getsum(in a int, in b int)
begin
declare c int default 0;
set c=a+b;
select c as '和';
end;
call getsum(21,34);
--用户变量
作用于当前整个连接
set @x=10;
set @y=24;
select @sum:=(@x+@y) as sum;
--会话变量
作用域限于当前客户端连接
show session variables;
--全局变量
作用域为整个服务,但不能跨重启(一个@是用户变量,两个@是全局)
select @@version;
自定义函数(可以省略in)
返回值写返回类型
create function getGrade(mark int)
returns varchar(20)
begin
return(
case floor(mark/10)
when 5 then '不及格'
when 6 then '继续努力'
when 7 then '成绩良好'
else '成绩优秀'
end
);
end;
select getGrade(100);
流程控制
- begin.... end程序块语句
将多条sql语句封装起来构成程序块
create procedure test1()
begin
declare x int;
declare y date;
begin
set x=100;
set y='2018-9-28';
select x,y;
end;
end;
call test1;
- if判断语句
用于条件判断,if语句要用end if结束
create procedure test2( in x int)
begin
if x>100 then
select 'perfect';
elseif x=100 then
select 'great';
else select 'good';
end if;
end;
- case分支语句
计算条件列表并返回多个可能结果表达式
create procedure test3(in score int)
begin
case score
when 1 then
select 'A';
when 2 then
select 'B';
when 3 then
select 'C';
else select 'D';
end case;
end;
case test3(2);
- while循环语句
设置重复执行sql语句或语句块的条件,只要指定的条件为真,就重复执行
create procedure test4(out sum int)
begin
declare i int default 1;
declare s int default 0;
while i<=10 do
set s=s+i;
set i=i+1;
end while;
set sum=s;
end;
call test4(@s);
select @s;
- loop循环语句
没有循环条件 通过leave退出循环(leave相当于break)
create procedure test5()
begin
declare i int default 0;
s:loop
set i=i+1;
if i=11 then
leave s;
end if;
end loop;
select i;
end;
- repeat循环语句
先执行一次循环体,在判断循环条件,为真退出循环,否则继续执行循环
create procedure test6()
begin
declare i int default 0;
repeat
set i=i+1;
until i>11
end repeat;
select i;
end;