一、什么是存储过程
简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;
ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用;
二、有哪些特性
有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能;
函数的普遍特性:模块化,封装,代码复用;
速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤;
三、创建一个简单的存储过程
存储过程will_add功能很简单,两个整型输入参数a和b,一个整型输出参数sum,功能就是计算输入参数a和b的结果,赋值给输出参数sum
几点说明:
DELIMITER $$ 把默认的输入的结束符;替换成$$。
1 DROP PROCEDURE IF EXISTS `will_add`;#删除已经存在的存储过程 2 delimiter $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义) 3 create procedure will_add(in a int, in b int, out sum int) 4 begin 5 if a is null then 6 set a = 0; 7 end if; 8 if b is null then 9 set b = 0; 10 end if; 11 set sum = a + b; 12 end$$ 13 delimiter ; #将语句的结束符号恢复为分号
调用存储过程:call procedure_name(参数)
四、查看数据库有哪些存储过程
1.查看数据库中的存储过程:show procedure status;
2.查看某个存储过程的创建代码:show create procedure proc_name;
五、存储过程中的控制语句
1.IF语句
1 drop procedure if exists `will_if`; 2 delimiter $$ 3 create procedure will_if(in type int) 4 begin 5 declare c varchar(128) default ''; 6 if(type = 0 || type = 1) then 7 set c = 'param is 0/1'; 8 elseif type = 2 then 9 set c = 'param is 2'; 10 else 11 set c = 'param is others, not in(0,1,2)'; 12 end if; 13 select c; 14 end$$ 15 delimiter ;
2.CASE语句
1 drop procedure if exists `will_case`; 2 delimiter $$ 3 create procedure will_case(in type int) 4 begin 5 declare c varchar(128) default ''; 6 case type 7 when 0 then 8 set c = 'param is 0'; 9 when 1 then 10 set c = 'param is 1'; 11 else 12 set c = 'param is others, not in(0,1)'; 13 end case; 14 select c; 15 end$$ 16 delimiter ;
3.while循环
1 drop procedure if exists `will_while`; 2 delimiter $$ 3 create procedure will_while(in n int) 4 begin 5 declare i int; 6 declare s int; 7 set i = 0; 8 set s = 0; 9 while i <= n do 10 set s = s + i; 11 set i = i + 1; 12 end while; 13 select s; 14 end$$ 15 delimiter ;
六、存储过程中的参数
存储过程可以有0个或多个参数,用于存储过程的定义。
3种参数类型:
IN输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
OUT输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
INOUT输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
1.in输入参数
1 drop procedure if exists `will_in`; 2 delimiter $$ 3 create procedure will_in(in p_in int) 4 begin 5 select p_in; 6 set p_in = 2; 7 select p_in; 8 end$$ 9 delimiter ;
p_in在存储过程中被修改,但并不影响@p_in的值;因为前者为局部变量,后者为全局变量
2.out输出参数
1 drop procedure if exists `will_out`; 2 delimiter $$ 3 create procedure will_out(out p_out int) 4 begin 5 select p_out; 6 set p_out = 2; 7 select p_out; 8 end$$ 9 delimiter ;
3.inout输入输出参数
1 drop procedure if exists `will_inout`; 2 delimiter $$ 3 create procedure will_inout(inout p_inout int) 4 begin 5 select p_inout; 6 set p_inout = 2; 7 select p_inout; 8 end$$ 9 delimiter ;
七、存储过程的变量
1.定义变量
declare var_name data_type [default value](如果没有default子句,初始值为NULL)
例:declare myparam int default 100;
2.为变量赋值
set var_name=expr
例:
declare var1, var2, var3 int;
set var1=10, var2=20;
set var3=var1+var2;
Mysql还可以通过select...into为一个或多个变量赋值
declare name char(50);
declare id decimal(8,2);
select id,name into id,name from table_name where id = 2;