MySql存储过程

一、什么是存储过程

简单的说,就是一组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;

posted @ 2018-01-17 22:56  划水的猫  阅读(298)  评论(0编辑  收藏  举报