触发器
触发器作用:当操作了某张表时,希望同时触发一些动作/行为,可以使用触发器完成
需求: 当向员工表插入一条记录时,希望mysql自动同时往日志表插入数据
-- 创建触发器(添加)
CREATE TRIGGER tri_empAdd AFTER INSERT ON employee FOR EACH ROW
INSERT INTO test_log(content) VALUES('员工表插入了一条记录');
-- 创建触发器(修改)
CREATE TRIGGER tri_empUpd AFTER UPDATE ON employee FOR EACH ROW
INSERT INTO test_log(content) VALUES('员工表修改了一条记录');
-- 创建触发器(删除)
CREATE TRIGGER tri_empDel AFTER DELETE ON employee FOR EACH ROW
INSERT INTO test_log(content) VALUES('员工表删除了一条记录');
tri_empAdd:标识触发器名称,用户自行指定;
AFTER:标识触发时机,取值为 BEFORE 或 AFTER;( 之前 或 之后 )
NSERT:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
employee :标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条
存储过程
-
基本格式
-- 声明结束符 -- 创建存储过程 DELIMITER $ -- 声明存储过程的结束符 CREATE PROCEDURE pro_test() --存储过程名称(参数列表) BEGIN -- 可以写多个sql语句; -- sql语句+流程控制 SELECT * FROM employee; END $ -- 结束 结束符 -- 执行存储过程 CALL pro_test(); -- CALL 存储过程名称(参数); -- 删除存储过程 DROP PROCEDURE pro_test; 参数: IN: 表示输入参数,可以携带数据带存储过程中 OUT: 表示输出参数,可以从存储过程中返回结果
-
带有输入参数的存储过程
需求:传入一个员工的id,查询员工信息 DELIMITER $ CREATE PROCEDURE pro_findById(IN eid INT) -- IN: 输入参数 BEGIN SELECT * FROM employee WHERE id=eid; END $ -- 调用 CALL pro_findById(4);
-
带有输出参数的存储过程
DELIMITER $ CREATE PROCEDURE pro_testOut(OUT str VARCHAR(20)) -- OUT:输出参数 BEGIN -- 给参数赋值 SET str='hellojava'; END $
-
带有输入输出参数的存储过程
DELIMITER $ CREATE PROCEDURE pro_testInOut(INOUT n INT) -- INOUT: 输入输出参数 BEGIN -- 查看变量 SELECT n; SET n =500; END $ -- 调用 SET @n=10; CALL pro_testInOut(@n); SELECT @n;
-
带有条件判断的存储过程
需求:输入一个整数,如果1,则返回“星期一”,如果2,返回“星期二”,如果3,返回“星期三”。其他数字,返回“错误输入”; DELIMITER $ CREATE PROCEDURE pro_testIf(IN num INT,OUT str VARCHAR(20)) BEGIN IF num=1 THEN SET str='星期一'; ELSEIF num=2 THEN SET str='星期二'; ELSEIF num=3 THEN SET str='星期三'; ELSE SET str='输入错误'; END IF; END $ --调用 CALL pro_testIf(4,@str); SELECT @str;
-
带有循环功能的存储过程
需求: 输入一个整数,求和。例如,输入100,统计1-100的和 DELIMITER $ CREATE PROCEDURE pro_testWhile(IN num INT,OUT result INT) BEGIN -- 定义一个局部变量 DECLARE i INT DEFAULT 1; DECLARE vsum INT DEFAULT 0; WHILE i<=num DO SET vsum = vsum+i; SET i=i+1; END WHILE; SET result=vsum; END $ --调用 CALL pro_testWhile(100,@result); SELECT @result;
网友评论