MySQL存储过程
Posted 看,未来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL存储过程相关的知识,希望对你有一定的参考价值。
存储过程和函数可以理解为一段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 |
+-------+
#因为out是向调用者输出参数,不接收输入的参数,所以存储过程里的p_out为null
+-------+
| p_out |
+-------+
| 2 |
+-------+
mysql> select @p_out;
+--------+
| @p_out |
+--------+
| 2 |
+--------+
#调用了out_param存储过程,输出参数,改变了p_out变量的值
>输入值使用in参数;
>返回值使用out参数;
>inout参数就尽量的少用。
存储过程的优缺点
存储过程的优点
1.第一点优势就是执行速度快,因为我们的每个sql语句执行都需要经过编译,然后在运行,但是存储过程都是直接编译好了之后直接运行即可
2.第二点优势就是减少网络流量,我们传输一个存储过程比我们传输大量的sql语句的开销要小的多
3.第三点就是提高系统安全性,因为存储过程可以使用权限控制,而且参数化的存储过程可以有效的放置slq注入攻击,保证了其安全性
4.第四点就是耦合性降低,当我们表结构发生变化之后,我们可以修改相应的存储过程,我们的应用程序在一定程度上需要改动的地方就比较少了
5.第五点就是重用性强。因为我们在写好一个存储过程之后,再次调用只需要一个名称即可,也就是一次编写,随处调用,而且使用存储过程也可以让程序的模块化加强
存储过程的缺点
1.移植性差。因为存储过程是和数据库绑定的,如果我们更换数据库之类的操作,可能很多地方需要改动。
2.修改不方便。因为对于存储过程而言,我们并不能特别有效的调试,他的一些bug可能发现的会晚,增加了应用的危险性。
3.优势不明显赘余功能。对于小型的web应用来说,如果我们使用语句缓存,发现编译sql的开销并不大,但是使用在存储过程缺需要检查权限一类的开销,这些赘余功能也会在一定程度上拖累性能
以上是关于MySQL存储过程的主要内容,如果未能解决你的问题,请参考以下文章