您的位置:首页 > 数据库 > MySQL

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脚本。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: