当一个大型系统在建立时,会发现,很多的SQL操作是有重叠的,个别计算是相同的,比如:业务系统中,计算一张工单的计算方式。当遇到这些情况时,我们运用存储过程就是一个非常棒的优化啦。

MYSQL储存过程简介:

储存过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。存储过程通常有以下优点:

1)存储过程能实现较快的执行速度。---编译优化,快!

如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。

2)存储过程允许标准组件是编程。---封装与抽象,简单调用

存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。

3)存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
4)存储过程可被作为一种安全机制来充分利用。---限制与安全
系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

5)存储过程能过减少网络流量。----减少网络流量(封装的好)

针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。

存储函数(自定义函数)又是什么呢?

封装一段sql代码,完成一种特定的功能,必须返回结果。其余特性基本跟存储过程相同。

存储函数与存储过程的区别

1) 存储函数有且只有一个返回值,而存储过程不能有返回值。就是说能不能使用return。(函数可返回返回值或者表对象,绝对不能返回结果集)

2) 函数只能有输入参数,而且不能带in, 而存储过程可以有多个in,out,inout参数。

3) 存储过程中的语句功能更强大,存储过程可以实现很复杂的业务逻辑,而函数有很多限制,如不能在函数中使用insert,update,delete,create等语句;存储函数只完成查询的工作,可接受输入参数并返回一个结果,也就是函数实现的功能针对性比较强。比如:工期计算、价格计算。

4)存储过程可以调用存储函数。但函数不能调用存储过程。

5)存储过程一般是作为一个独立的部分来执行(call调用)。而函数可以作为查询语句的一个部分来调用。

MySQL 创建一个最简单的存储过程:

“pr_add” 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 “a”、“b”,返回这两个参数的和
drop procedure if exists pr_add;
//计算两个数之和
create PROCEDURE pr_add(
    in a int,
    in b int
)
begin
declare c in; //是声明变量的关键字
if a is null THEN
    set a=1;
end if:
if b is null THEN
    set b=1;
end if;
set c=a+b;
select c as sum;
end;

call pr_add(null,null);//这是调用存储过程pr_add

MySQL 存储过程特点:

存储过程的简单语法:

create procedure 存储过程名字()

(

[in|out|inout] 参数 datatype

)

begin

MySQL 语句;

end;
MySQL 存储过程参数如果不显式指定“in”、“out”、“inout”,则默认为“in”。习惯上,对于是“in” 的参数,我们都不会显式指定。
  1.  MySQL 存储过程名字后面的“()”是必须的,即使没有一个参数,也需要“()”
  2.  MySQL 存储过程参数,不能在参数名称前加“@”,如:“@a int”。下面的创建存储过程语法在 MySQL 中是错误的(在 SQL Server 中是正确的)。 MySQL 存储过程中的变量,不需要在变量名字前加“@”,虽然 MySQL 客户端用户变量要加个“@”。
    create produre pr_add(@a int,//错误    b int//正确)
  3. MySQL 存储过程的参数不能指定默认值。
  4. MySQL 存储过程不需要在 procedure body 前面加 “as”。而 SQL Server 存储过程必须加 “as” 关键字。
  5. 如果 MySQL 存储过程中包含多条 MySQL 语句,则需要 begin end 关键字。

    create procedure pr_add( a int, b int)
    begin mysql statement 1 ...;
     mysql statement 2 ...;
    end;
  6.  MySQL 存储过程中的每条语句的末尾,都要加上分号 “;”
  7.  不能在 MySQL 存储过程中使用 “return” 关键字。
  8. 调用 MySQL 存储过程时候,需要在过程名字后面加“()”,即使没有一个参数,也需要“()”,调用out及inout参数格式为@arguments_name形式。
    call pr_no_param();
  9. 因为 MySQL 存储过程参数没有默认值,所以在调用 MySQL 存储过程时候,不能省略参数。可以用 null 来替代。
    call pr_add(10, null);

实战技术文:
变量 使用DECLARE来声明,DEFAULT赋默认值,SET赋值
条件判断 IF THEN、ELSEIF、ELSE、END IF
循环 LOOP、END LOOP
存储方法
触发器 触发器在INSERT、UPDATE或DELETE等DML语句修改数据库表时触发 触发器的典型应用场景是重要的业务逻辑、提高性能、监控表的修改等