存储过程和函数可以理解为一段sql的集合,他们被事先编译好并且存储在数据库中。
创建/调用存储过程
create procedure 存储过程名(参数列表)
begin
存储过程体
end
例如:
delimiter $$
create procedure test()
begin
select * from test_table;
end;
delimiter ;
call user_data();
存储过程体
存储过程体包含了在过程调用时必须执行的语句,例如:dml、ddl语句,if-then-else和while-do语句、声明变量的declare语句等。
过程体格式:以begin开始,以end结束(可嵌套):
BEGIN
BEGIN
BEGIN
statements;
END
END
END
为语句块贴标签
[begin_label:] BEGIN
[statement_list]
END [end_label]
比方说要用循环的时候。
mysql> create procedure pro10()
-> begin
-> declare i int;
-> set i=0;
-> while i<5 do
-> insert into t1(filed) values(i);
-> set i=i+1;
-> end while;
-> end;
mysql> create procedure pro12()
-> begin
-> declare i int default 0;
-> loop_label: loop
-> insert into t1(filed) values(i);
-> set i=i+1;
-> if i>=5 then
-> leave loop_label;
-> end if;
-> end loop;
-> end;
参数列表
IN输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
OUT输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
INOUT输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
来俩示例就都明白了,也不难的东西:
mysql> delimiter $$
mysql> create procedure in_param(in p_in int)
-> begin
-> select p_in;
-> set p_in=2;
-> select P_in;
-> end$$
mysql> delimiter ;
mysql> set @p_in=1;
mysql> call in_param(@p_in);
+
| p_in |
+
| 1 |
+
+
| P_in |
+
| 2 |
+
mysql> select @p_in;
+
| @p_in |
+
| 1 |
+
mysql> delimiter
mysql> create procedure out_param(out p_out int)
-> begin
-> select p_out;
-> set p_out=2;
-> select p_out;
-> end
->
mysql> delimiter ;
mysql> set @p_out=1;
mysql> call out_param(@p_out);
+
| p_out |
+
| NULL |
+
+
| p_out |
+
| 2 |
+
mysql> select @p_out;
+
| @p_out |
+
| 2 |
+
>输入值使用in参数;
>返回值使用out参数;
>inout参数就尽量的少用。
存储过程的优缺点
存储过程的优点
1.第一点优势就是执行速度快,因为我们的每个sql语句执行都需要经过编译,然后在运行,但是存储过程都是直接编译好了之后直接运行即可 2.第二点优势就是减少网络流量,我们传输一个存储过程比我们传输大量的sql语句的开销要小的多 3.第三点就是提高系统安全性,因为存储过程可以使用权限控制,而且参数化的存储过程可以有效的放置slq注入攻击,保证了其安全性 4.第四点就是耦合性降低,当我们表结构发生变化之后,我们可以修改相应的存储过程,我们的应用程序在一定程度上需要改动的地方就比较少了 5.第五点就是重用性强。因为我们在写好一个存储过程之后,再次调用只需要一个名称即可,也就是一次编写,随处调用,而且使用存储过程也可以让程序的模块化加强
存储过程的缺点
1.移植性差。因为存储过程是和数据库绑定的,如果我们更换数据库之类的操作,可能很多地方需要改动。 2.修改不方便。因为对于存储过程而言,我们并不能特别有效的调试,他的一些bug可能发现的会晚,增加了应用的危险性。 3.优势不明显赘余功能。对于小型的web应用来说,如果我们使用语句缓存,发现编译sql的开销并不大,但是使用在存储过程缺需要检查权限一类的开销,这些赘余功能也会在一定程度上拖累性能
|