????????存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后,再次调用不需要重复编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它
为什么要使用存储过程
?? ?1. 业务流程复杂
?? ??? ?业务复杂时,SQL语句相互依赖,顺序执行
?? ?2. 频繁访问数据库
?? ??? ?每条SQL语句都需单独连接和访问数据库
?? ?3. 先编译后执行
?? ??? ?SQL语句的执行需要先编译
创建存储过程
?? ?CREATE PROCEDURE (
?? ?[ [IN |OUT |INOUT ] 参数名 数据类型…])
?? ?BEGIN
??? ??? ?DECLARE 变量 变量类型
?? ?END
说明:
? '[ ]'内容不是必须的;
? in:表示入参;
? out:表示返回值;
? inout:表示即是入参又是返回值。
调用存储过程
?? ?CALL 存储过程名 [参数名]
删除存储过程
?? ?DROP PROCEDURE 存储过程名;
存储过程与函数的区别
?? ?1. 语法
?? ?关键字不同,存储过程是procedure;函数是function;
?? ?2. 执行
?? ?存储过程可以独立执行,函数必须依赖表达式的调用;
?? ?3. 返回值
?? ?存储过程可以定义多个返回结果;函数只有一个返回值;
?? ?4. 功能
?? ?存储过程可以做业务逻辑,函数不易做复杂的业务逻辑
存储过程的缺陷
?? ?1. 移植性
?? ?大多数关系型数据库的存储过程存在细微差异。兼容性极差
?? ?2. 维护性
?? ?存储过程的维护成本高,修改调试较为麻烦
?? ?3. 协作性
?? ?没有相关的版本控制或者IDE,团队中对于存储过程的使用大多是依赖文档
什么是触发器? ?
?????????一种存储过程,与表相关联,自动执行,而且是隐式执行
??触发器是数据库中针对数据仓库操作出发的特殊的存储过程
触发器的操作
?? ?1. 查看所有的触发器
?? ?SELECT * FROM information_schema.`TRIGGERS`
?? ?WHERE trigger_schema = ‘库名'
?? ?2. 删除触发器
?? ?DROP TRIGGER 触发器名
创建触发器
?? ?CREATE
??? ?TRIGGER 数据库名.触发器名
?? ? ? ?BEFORE/AFTER -- 触发顺序
?? ? ? ?INSERT/UPDATE/DELETE – 触发事件
?? ? ON 数据库.表名 -- 事件表
??? ? ? ?FOR EACH ROW?
??? ?BEGIN
??? ? ? ?触发器内容 -- 事件出发后要写的语句
??? ?END$$
触发器的查看
?? ?查看所有的触发器:
?? ?SELECT * FROM information_schema.`TRIGGERS`
?? ?WHERE trigger_schema = ‘库名'
删除触发器:
?? ?DROP TRIGGER 触发器名
????1. 语法:
?? ?关键字不同,存储过程是procedure,触发器是trigger
?? ?2. 执行:
?? ?存储过程需要调用才执行,触发器自动执行
?? ?3. 返回值:
?? ?存储过程可以定义返回值,但是触发器没有返回值
?? ?4. 功能:
?? ?存储过程是一组特定功能的SQL语句,触发器则是SQL语句后执行,本身不影响原功能