当一个大型系统在建立时,会发现,很多的SQL操作是有重叠的,个别计算是相同的,比如:业务系统中,计算一张工单的计算方式。当遇到这些情况时,我们运用存储过程就是一个非常棒的优化啦。
MYSQL储存过程简介:
储存过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。存储过程通常有以下优点:1)存储过程能实现较快的执行速度。---编译优化,快!
如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
2)存储过程允许标准组件是编程。---封装与抽象,简单调用
存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
3)存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
4)存储过程可被作为一种安全机制来充分利用。---限制与安全
系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
5)存储过程能过减少网络流量。----减少网络流量(封装的好)
针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。
存储函数(自定义函数)又是什么呢?
封装一段sql代码,完成一种特定的功能,必须返回结果。其余特性基本跟存储过程相同。存储函数与存储过程的区别:
1) 存储函数有且只有一个返回值,而存储过程不能有返回值。就是说能不能使用return。(函数可返回返回值或者表对象,绝对不能返回结果集) 3) 存储过程中的语句功能更强大,存储过程可以实现很复杂的业务逻辑,而函数有很多限制,如不能在函数中使用insert,update,delete,create等语句;存储函数只完成查询的工作,可接受输入参数并返回一个结果,也就是函数实现的功能针对性比较强。比如:工期计算、价格计算。
4)存储过程可以调用存储函数。但函数不能调用存储过程。
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” 的参数,我们都不会显式指定。
- MySQL 存储过程名字后面的“()”是必须的,即使没有一个参数,也需要“()”
- MySQL 存储过程参数,不能在参数名称前加“@”,如:“@a int”。下面的创建存储过程语法在 MySQL 中是错误的(在 SQL Server 中是正确的)。 MySQL 存储过程中的变量,不需要在变量名字前加“@”,虽然 MySQL 客户端用户变量要加个“@”。
create produre pr_add(@a int,//错误 b int//正确)
- MySQL 存储过程的参数不能指定默认值。
- MySQL 存储过程不需要在 procedure body 前面加 “as”。而 SQL Server 存储过程必须加 “as” 关键字。
-
如果 MySQL 存储过程中包含多条 MySQL 语句,则需要 begin end 关键字。
create procedure pr_add( a int, b int) begin mysql statement 1 ...; mysql statement 2 ...; end;
- MySQL 存储过程中的每条语句的末尾,都要加上分号 “;”
- 不能在 MySQL 存储过程中使用 “return” 关键字。
- 调用 MySQL 存储过程时候,需要在过程名字后面加“()”,即使没有一个参数,也需要“()”,调用out及inout参数格式为@arguments_name形式。
call pr_no_param();
- 因为 MySQL 存储过程参数没有默认值,所以在调用 MySQL 存储过程时候,不能省略参数。可以用 null 来替代。
call pr_add(10, null);
变量 使用DECLARE来声明,DEFAULT赋默认值,SET赋值
条件判断 IF THEN、ELSEIF、ELSE、END IF
循环 LOOP、END LOOP
存储方法
触发器 触发器在INSERT、UPDATE或DELETE等DML语句修改数据库表时触发 触发器的典型应用场景是重要的业务逻辑、提高性能、监控表的修改等