Mysql存储过程以及触发器
2017-10-24 15:37
477 查看
1. Mysql简单存储过程
Mysql的存储过程是一个由一组SQL语句构成的脚本,能够实现简单的逻辑功能,但是用在分层的框架中不是很好,一旦更换数据库这个脚本结构要重写。存储过程区别去触发器,是主动调用的。存储过程可以有输入输出参数,可以申明变量,可以使用简单的if/else,case,while 等简单的控制语句,可以实现复杂的逻辑过程。
存储过程只需要首次运行时编译,之后调用就不需要编译了。
1.1 一个简单的HelloWorld
-- ---------------------------- -- Procedure structure for `proc_HelloWorld` -- 两个整型输入参数a和b,一个整型输出参数sum,功能就是计算输入参数a和b的结果,赋值给输出参数sum; -- ---------------------------- DROP PROCEDURE IF EXISTS `proc_adder`; DELIMITER ;; #把默认的输入的结束符;替换成;; CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int) #DEFINER:创建者 BEGIN #Routine body goes here... DECLARE c int; if a is null then set a = 0; end if; if b is null then set b = 0; end if; set sum = a + b; END ;; DELIMITER ;
调用存储过程
set @b=5; call proc_HelloWorld(2,@b,@s) select @s as sum
结果
1.2 存储过程中的控制语句-if
-- ---------------------------- -- Procedure structure for `proc_if` -- 判断入参是否为1或者0 -- ---------------------------- DROP PROCEDURE IF EXISTS `proc_if`; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_if`(IN type int) BEGIN #Routine body goes here... DECLARE c varchar(500); IF type = 0 THEN set c = 'param is 0'; ELSEIF type = 1 THEN set c = 'param is 1'; ELSE set c = 'param is others, not 0 or 1'; END IF; select c; END ;; DELIMITER ;
调用存储过程
set @type=1; call proc_if(@type)
结果
1.3 存储过程-CASE
-- ---------------------------- -- Procedure structure for `proc_case` -- 判断入参是否为1或者0 -- ---------------------------- DROP PROCEDURE IF EXISTS `proc_case`; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_case`(IN type int) BEGIN #Routine body goes here... DECLARE c varchar(500); CASE type WHEN 0 THEN set c = 'param is 0'; WHEN 1 THEN set c = 'param is 1'; ELSE set c = 'param is others, not 0 or 1'; END CASE; select c; END ;; DELIMITER ;
调用存储过程
set @type=3; call proc_case(@type)
结果
1.4 存储过程-WHILE
-- ---------------------------- -- Procedure structure for `proc_while` -- 累加从1+...+n -- ---------------------------- DROP PROCEDURE IF EXISTS `proc_while`; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_while`(IN n int) BEGIN #Routine body goes here... DECLARE i int; DECLARE s int; SET i = 0; SET s = 0; WHILE i <= n DO set s = s + i; set i = i + 1; END WHILE; SELECT s; END ;; DELIMITER ;
调用存储过程
set @type=100; call proc_while(@type)
结果
2. Mysql触发器
2.1 触发器基本语法
触发器创建语法四要素:监事地点(table)
监视事件(insert/udpate/delete)
触发时间(after/before)
触发事件(insert/update/delete)
基本语法
create trigger triggerName after/before insert/update/delete on 表名 for each row #这句话在mysql是固定的 begin sql语句; end;
由于最近在学习使用Navicat,后续的例子就用Navicat来完成
首相创建两张表
1)person表
2)card表(其中id自增)
我要实现的业务逻辑是,每当在person表中新插入一条记录,card表中就会相应地自动生成记录。在person表的设计表选项卡中去新添加这个触发器。
这个时候Navicat自动生成的触发器SQL如下
保存后,在person表中新添加一条记录并提交
这个时候在card表中会自动插入一条新的记录
学习心得触犯器区别与存储过程,存储过程是一个需要主动去调用的带有复杂逻辑的SQL脚本,实现了对业务逻辑的封装复用。触发器是一个监听事件并自动调用的SQL脚本。
相关文章推荐
- mysql中的存储过程、触发器、视图是如何创建的,以及PHP中是如何调用的
- MySQL 中的存储过程以及触发器的讲解
- mysql中的存储过程、触发器、视图是如何创建的,以及PHP中是如何调用的
- mysql中的触发器以及存储过程的基础了解
- mysql的存储过程和触发器的使用 以及php中的调用方法
- mysql里的批处理(sql语句)、触发器、事务管理、存储过程
- 第一个MYSQL存储过程以及其中遇到的空格问题
- MySQL 存储过程带in和out参数以及PHP,PB如何调用的小例子
- 数据库的几个问题存储过程触发器函数创建以及sql优化
- Mysql存储过程的创建以及调用
- LPAD在Oracle中和 mssql以及在MySQL中的不同用法 以及调用存储过程方法
- mysql触发器与存储过程
- MySQL修改存储过程和函数、事件、触发器、视图的DEFINER
- mysql存储过程和触发器 --- 一次很有意思的尝试
- mysql触发器与存储过程
- mysql之存储过程和触发器的应用
- MySQL存储过程以及在JAVA中的程序调用
- mysql查看所有存储过程,函数,视图,触发器,表,分页
- mysql里的批处理(sql语句)、触发器、事务管理、存储过程
- 修改MySql的存储过程、函数、事件、触发器、视图的 DEFINER