在机器语言中,有一个概念叫“过程”procedure,和“函数”function
过程:封装了若干条语句,调用时,这些封装体执行,过程是没有返回值的函数
函数:函数是一个有返回值的过程
存储过程是可以编程的,意味着可以使用变量,表达式,控制结构来完成复杂的功能
我们把若干条sql封装起来,起个名字—过程
把此过程存储在数据库中—存储过程
- 存储过程的创建语法
create procedure procedureName()
begin
--- sql 语句;
end$
- 查看已有的存储过程
SHOW PROCEDURE STATUS
- 调用存储过程
CALL PROCEDURE ()
常用控制语句及示例
- 存储过程中用declare来声明变量
格式 declare 变量名 变量类型 (default 默认值)
delimiter $
create procedure pr1()
begin
declare age int default 18;
declare height int default 180;
select concat('age:', age, ', ', 'height:', height);
end$
call pr1()
输出 :age:18, height:180
- 运算,控制
存储过程中,变量可以在sql语句中合法的运算,如+ - * /
注意的是,运算的结果,如何赋值给变量
变量名 :# expression
delimiter $
create procedure pr2()
begin
declare age int default 18;
set age := age + 20;
select concat('20年后age: ', age);
end$
call pr2()
输出 :20年后age: 38
- if/else控制结构
if condition then
statement
else
end
delimiter $
create procedure pr3()
begin
declare age int default 18;
if age >= 18 then
select '已成年';
else
select '未成年';
end if;
end$
call pr3()
输出 : 已成年
- 给存储过程传参
存储过程的括号里可以声明参数,语法是[in/out/inout] 参数名 参数类型
delimiter $
create procedure pr4(width int, hight int)
begin
select concat('你的面积是:', width * hight) as area;
if width > hight then
select '你挺胖';
elseif width < hight then
select '你挺瘦';
else
select '你还挺方的';
end if;
end$
call pr4(1, 2)
输出 :
结果1 : 你的面积是:4
结果2 : 你还挺方的
控制结构
顺序,选择,循环
-
while
求n-m的和
delimiter $
create procedure pr5(n int, m int)
begin
declare total int default 0;
while n <= m do
set total := total + n;
set n := n + 1;
end while;
select total;
end$
call pr5(1, 4)
输出 :10
- case
delimiter $
create procedure pr6()
begin
declare pos int default 0;
set pos := floor(4*rand());
case pos
when 1 then select 'hello';
when 2 then select 'hi';
when 3 then select 'good by';
else select 'I dont know';
end case;
end$
call pr6()
输出 : hi
- repeat
delimiter $
create procedure pr7(i int, max int)
begin
declare total int default 0;
repeat
set total := total + i;
set i := i+1;
until i > max end repeat;
select total;
end$
call pr7(2, 5)
输出 : 14
-
参数类型[in/out/inout]
in 参数是输入类型,可以接收到我们的参数
out 参数是输出类型
可变参数 inout老板赚了50000给员工开工资钱数及其剩余
delimiter $
create procedure pr8(in employeNum int, in salary int, out expend int, inout residue int)
begin
set expend := employeNum * salary;
set residue := residue - expend;
end$
set @residue := '50000';
call pr8(5, 6000, @expend, @residue);
select @expend;
select @residue;
输出 : @expend :30000, @residue : 20000
用户变量 : @var_name
@expend 类似的变量是一个用户变量,可以先在客户端中定义并且保存值然后在以后引用它;这样可以将值从一个语句传递到另一个语句。用户变量与连接有关。也就是说,一个客户端定义的变量不能被其它客户端看到或使用。当客户端退出时,该客户端连接的所有变量将自动释放。