1.为什么要使用存储过程
1.1 首先看一下一条SQL语句的执行过程
从图中可以看出一条SQL命令进入执行引擎后要进行几步:
(1)语法分析
(2)第一步正确的话,将SQL语句编译成mysql可以识别的命令
(3)执行命令
1.2 存储过程是什么
存储过程创建后可以省去每次SQL语句的语法分析和编译过程,只在存储引擎创建的时候进行初始化一次,并存储到mysql中,允许被外部程序调用
2.使用存储过程
2.1创建存储过程
CREATE PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
传递的参数类型
proc_parameter:
[ IN | OUT | INOUT ] param_name type
IN:在调用存储过程时传入,但不能返回
OUT:可以改变并返回,不一定要传入
INOUT:调用时传入,并可以改变和返回
2.2 例子
(1)不带参数的:获得mysql的版本
调用
(2)带IN参数
用一个user表实现插入操作
创建存储过程
结果显示插入成功
(3)创建带OUT类型的数据:加入用户并返回用户的总数
调用并查询
返回值
查看存储过程:
select * from mysql.proc;
3.什么时候使用存储过程
3.1 何时使用
当一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时就要考虑用存储过程;当在一个事务的完成需要很复杂的商
业逻辑时(比如,对多个数据的操作,对多个状态的判断更改等)要考虑
3.2 优点
(1)增强了SQL语句的灵活性
可以传参,可以在内部执行较为复杂的逻辑,可以有返回值
(2)更快:预编译
(3)减少了网络流量:传参数和传递SQL语句
1.3 缺点
(1)可移植性差:存储过程一般会绑定几张表或者实现固定的业务,当表或者业务发生改变后,存储过程也要相应的改变
(2)不利于面向对象程序设计,例如Spring的ORM(数据和实体之间的映射)
4.存储过程与函数的区别
1.存储过程实现的过程要复杂一些,而函数的针对性较强;
2.存储过程可以有多个返回值,而自定义函数只有一个返回值;3.存储过程一般独立的来执行,而函数往往是作为其他SQL语句的一部分来使用;