MySQL(七)-存储过程,视图,触发器
参考文献
- MySQL 8 Cookbook
存储过程
- 存储的函数(function)和过程(procedure)都称为存储例程(routine);
- 要创建存储过程,应该具有
CREATE ROUTINE
权限 - 存储函数有返回值,存储过程没有返回值.
- 所有代码都写在
BEGIN
和END
之间 - 存储函数可以直接在
SELECT
语句中调用 - 可以使用
CALL
语句调用存储过程.
1 | -- 修改最外层语句结束符 |
1 | --// 局部变量 ---------- |
语法
1 | -- 创建存储过程 |
参数
参数类型 | 是否返回 | 作用 |
---|---|---|
IN | 否 | 向存储过程传入参数,存储过程中修改该参数的值,不能被返回 |
OUT | 是 | 把存储过程计算的结果放到该参数中,调用者可以得到返回值 |
INOUT | 是 | IN和OUT的结合,既用于存储过程的传入参数,同时又可以把计算结果放到参数中,调用者可以得到返回值 |
流程控制语句
-
BEGIN..END
:BEGIN...END
中间包含了多个语句,每个语句都以(;)号为结束符。 -
DECLARE
:DECLARE
用来声明变量,使用的位置在与BEGIN...END
语句中间,而且需要在其他语句使用之前进行变量的声明 -
SET
:赋值语句,用于对变量进行赋值 -
SELECT...INTO
: 把数据表中查询的结果存放到变量中,也就是为变量赋值 -
IF...THEN...ENDIF
:条件判断语句,还可以使用IF...THEN...ENDIF
-
CASE
:用于多条件判断1
2
3
4
5
6CASE
WHEN experssion1 THEN ...
WHEN experssion1 THEN ...
-- ELSE可以加,可不加。加的话代表的所有条件都不满足时采用的方式
ELSE
END -
LOOP,LEAVE,ITERATE
:LOOP
是循环语句,使用LEAVE
(BREAK)可以跳出循环,使用ITERATE
(CONTINUE)则可以进入下一次循环 -
REPEAT...UNIT...END REPEAT
:这个循环语句,首先会执行一次,饭后在UNITL中进行表达式判断,如果满足条件就退出,即END REPAEAT;如果条件不满足,则会继续执行循环,知道满足退出条件为止。 -
WHILE...DO...END WHILE
:也是循环,和REPEAT循环不同的是,这个语句需要先进行条件判断,如果满足条件就进行循环,如果不满足条件就退出循环。
游标
游标操作步骤
-
定义
1
DECLARE cursor_name CURSOR FOR select_stament
-
打开游标
1
OPEN cursor_name
-
从游标中取得数据
1
FETCH cursor_name INTO var_name,....
-
关闭游标
1
CLOSE cursor_name
-
释放游标
1
DEALLOCATE PREPARE
视图
1 | 什么是视图: |
触发器
- Before Insert
- After Insert
- Before Update
- After Update
- Before Delete
- After Delete
使用场景
-
可以通过数据库中的相关表实现级联更改。
-
实时监控某张表中的某个字段的更改而需要做出相应的处理。
-
例如可以生成某些业务的编号。
-
注意不要滥用,否则会造成数据库及应用程序的维护困难。
-
大家需要牢记以上基础知识点,重点是理解数据类型CHAR和VARCHAR的差异,表存储引擎InnoDB和MyISAM的区别。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20触发程序是与表有关的命名数据库对象,当该表出现特定事件时,将激活该对象
监听:记录的增加、修改、删除。
-- 创建触发器
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
参数:
trigger_time是触发程序的动作时间。它可以是 before 或 after,以指明触发程序是在激活它的语句之前或之后触发。
trigger_event指明了激活触发程序的语句的类型
INSERT:将新行插入表时激活触发程序
UPDATE:更改某一行时激活触发程序
DELETE:从表中删除某一行时激活触发程序
tbl_name:监听的表,必须是永久性的表,不能将触发程序与TEMPORARY表或视图关联起来。
trigger_stmt:当触发程序激活时执行的语句。执行多个语句,可使用BEGIN...END复合语句结构
-- 删除
DROP TRIGGER [schema_name.]trigger_name
可以使用old和new代替旧的和新的数据
更新操作,更新前是old,更新后是new.
删除操作,只有old.
增加操作,只有new.
-- 注意
1. 对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HoleLin's Blog!