存储过程简介
我们常用的操作数据库语言sql语句在执行的时候需要要先编译,然后执行,而存储过程(stored procedure)是一组为了完成特定功能的sql语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
一个存储过程是一个可编程的函数,,它在数据库中创建并保存。它可以有sql语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。
存储过程通常有以下优点:
(1).存储过程增强了sql语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
(2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的sql语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
(3).存储过程能实现较快的执行速度。如果某一操作包含大量的transaction-sql代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的transaction-sql语句在每次运行时都要进行编译和优化,速度相对要慢一些。
(4).存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的transaction-sql语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。
(5).存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
mysql存储过程的创建
(1). 格式
mysql存储过程创建的格式:create procedure 过程名 ([过程参数[,...]]) procedure
[特性 ...] 过程体
例:
1. mysql> delimiter //
2. mysql> create procedure proc1(out s int)
3. -> begin
4. -> select count(*) into s from user;
5. -> end
6. -> //
7. mysql> delimiter ;
注:(1)这里需要注意的是delimiter //和delimiter ;两句,delimiter是分割符的意思,因为mysql默认以;为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成sql语句进行处理,则存储过程的编译过程会报错,所以要事先用delimiter关键字申明当前段分隔符,这样mysql才会将;当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
(2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用,分割开。
(3)过程体的开始与结束使用begin与end进行标识。
这样,我们的一个mysql存储过程就完成了,是不是很容易呢?看不懂也没关系,接下来,我们详细的讲解。
(2). 声明分割符
其实,关于声明分割符,上面的注解已经写得很清楚,不需要多说,只是稍微要注意一点的是:如果是用mysql的administrator管理工具时,可以直接创建,不再需要声明。
(3). 参数
mysql存储过程的参数用在存储过程的定义,共有三种参数类型,in,out,inout,形式如:
create procedure([[in |out |inout ] 参数名 数据类形...])
in 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
out 输出参数:该值可在存储过程内部被改变,并可返回
inout 输入输出参数:调用时指定,并且可被改变和返回
in参数例子
创建:
1. mysql > delimiter //
2. mysql > create procedure demo_in_parameter(in p_in int)
3. -> begin
4. -> select p_in; /*查询输入参数*/
5. -> set p_in=2; /*修改*/
6. -> select p_in; /*查看修改后的值*/
7. -> end;
8. -> //
9. mysql > delimiter ;
执行结果:
1. mysql > set @p_in=1;
2. mysql > call demo_in_parameter(@p_in);
3. +------+
4. | p_in |
5. +------+
6. | 1 |
7. +------+
8.
9. +------+
10. | p_in |
11. +------+
12. | 2 |
13. +------+
14.
15. mysql> select @p_in;
16. +-------+
17. | @p_in |
18. +-------+
19. | 1 |
20. +-------+
以上可以看出,p_in虽然在存储过程中被修改,但并不影响@p_id的值
out参数例子
创建:
1. mysql > delimiter //
2. mysql > create procedure demo_out_parameter(out p_out int)
3. -> begin
4. -> select p_out;/*查看输出参数*/
5. -> set p_out=2;/*修改参数值*/
6. -> select p_out;/*看看有否变化*/
7. -> end;
8. -> //
9. mysql > delimiter ;
执行结果:
1. mysql > set @p_out=1;
2. mysql > call sp_demo_out_parameter(@p_out);
3. +-------+
4. | p_out |
5. +-------+
6. | null |
7. +-------+
8. /*未被定义,返回null*/
9. +-------+
10. | p_out |
11. +-------+
12. | 2 |
13. +-------+
14.
15. mysql> select @p_out;
16. +-------+
17. | p_out |
18. +-------+
19. | 2 |
+-------+
inout参数例子
创建:
1. mysql > delimiter //
2. mysql > create procedure demo_inout_parameter(inout p_inout int)
3. -> begin
4. -> select p_inout;
5. -> set p_inout=2;
6. -> select p_inout;
7. -> end;
8. -> //
9. mysql > delimiter ;
执行结果:
1. mysql > set @p_inout=1;
2. mysql > call demo_inout_parameter(@p_inout) ;
3. +---------+
4. | p_inout |
5. +---------+
6. | 1 |
7. +---------+
8.
9. +---------+
10. | p_inout |
11. +---------+
12. | 2 |
13. +---------+
14.
15. mysql > select @p_inout;
16. +----------+
17. | @p_inout |
18. +----------+
19. | 2 |
+----------+
(4). 变量
ⅰ. 变量定义
declare variable_name [,variable_name...] datatype [default value];
