存储过程
简介
-- 存储过程
/*
类似于Java中的方法
*/
-- 存储过程
/*
含义:一组预先编译好的SQL语句的集合,理解成批处理语句
*/
#一、创建语法
-- 定义结束标记
DELIMITER $$
CREATE
PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组SQL语句)
END$$
DELIMITER ;
-- DELIMITER $$定义存储过程的结束标记,DELIMITER ;表示恢复;为SQL语句的结束标记
/*
参数列表包含三部分:参数模式 参数名 参数类型
举例:in stuname varchar
1、参数模式:
IN:该参数作为输入
OUT:该参数作为输出
INOUT:该参数既可以作为输入,也可以作为输出
2、如果存储过程体只要一句SQL,那么begin...end可以省略;
3、存储过程体的每条SQL语句的结尾必须加分号,存储过程使用delimiter 结束标记来设置结束标记
*/
#二、调用语法
CALL 存储过程名(实参列表);
空参列表
CREATE TABLE IF NOT EXISTS student(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL UNIQUE,
pwd VARCHAR(20) NOT NULL
);
#1、空参列表
#案例:插入student表中3条记录
DELIMITER $$
CREATE
PROCEDURE myProcedure1()
BEGIN
INSERT INTO student(username, pwd) VALUES ('张三','3333');
INSERT INTO student(username, pwd) VALUES ('李四','4444');
INSERT INTO student(username, pwd) VALUES ('王五','5555');
END $$
DELIMITER ;
-- 调用存储过程
CALL myProcedure1();
SELECT * FROM student;
/*
id username pwd
1 张三 3333
2 李四 4444
3 王五 5555
*/
IN模式的参数
#2、in模式的存储过程
#案例:创建存储过程删除对应id的学生
DELIMITER $$
CREATE
PROCEDURE myProcedure2(IN id INT)
BEGIN
DELETE FROM student WHERE student.`id` = id;
END $$
DELIMITER ;
-- 调用存储过程
SET @id:=1;
CALL myProcedure2(@id);
SELECT * FROM student;
/*
id username pwd
2 李四 4444
3 王五 5555
*/
OUT模式的参数
# 3、out模式
# 案例:创建存储过程查看student表中的记录数
DELIMITER $$
CREATE
PROCEDURE myProcedure3(OUT num INT)
BEGIN
SELECT COUNT(*) INTO num FROM student;
END $$
DELIMITER ;
-- 调用存储过程
SET @num:=0;
CALL myProcedure3(@num);
SELECT @num;
# 2
INOUT模式的参数
# 4、inout模式
# 案例:创建存储过程删除指定编号的学生,并返回剩余学生数
DELIMITER $$
CREATE
PROCEDURE myProcedure4(INOUT num INT)
BEGIN
DELETE FROM student WHERE id = num;
SELECT COUNT(*) INTO num FROM student;
END $$
DELIMITER ;
-- 调用存储过程
SET @num:=2;
CALL myProcedure4(@num);
SELECT @num;
# 1
存储过程的删除和查看
-- 三、删除存储过程
DROP PROCEDURE myProcedure1;
-- 四:查看存储过程
SHOW CREATE PROCEDURE myProcedure2;
触发器
简介
数据库中的一个对象,相当于JS中的监听器,触发器可以监听【增删改】三个动作。
-- 触发器
# 语法
DELIMITER $$
CREATE
TRIGGER 触发器名 BEFORE/AFTER INSERT/UPDATE/DELETE
ON 表名
FOR EACH ROW BEGIN
END$$
DELIMITER ;
/*
BEFORE:增删改之前
AFTER:增删改之后
*/
HelloWorld
-- 案例1、当我向student表中插入一条数据时,默认向logger表中增加一条日志
CREATE TABLE IF NOT EXISTS logger(
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(30) NOT NULL,
`time` DATETIME
);
-- 创建触发器
DELIMITER $$
CREATE
TRIGGER myTrigger1 AFTER INSERT
ON student
FOR EACH ROW BEGIN
INSERT INTO logger VALUES(NULL, 'student表新增了一条记录',NOW());
END $$
DELIMITER;
INSERT INTO student(username, pwd) VALUES('赵六','6666');
SELECT * FROM logger;
/*
id content time
1 student表新增了一条记录 2020-08-08 10:45:09
*/
new字段
-- 案例2:当我向student表中新增一条记录时,stu_info表也要新增一条这样的记录
CREATE TABLE IF NOT EXISTS stu_info SELECT * FROM student WHERE 1 = 2;
DELIMITER $$
CREATE
TRIGGER myTrigger2 AFTER INSERT
ON student
FOR EACH ROW BEGIN
INSERT INTO stu_info VALUES(new.id, new.username, new.pwd);
END $$
DELIMITER ;
INSERT INTO student VALUES(NULL, '田七', '7777');
SELECT * FROM stu_info;
/*
id username pwd
5 田七 7777
*/
old字段
-- 案例3:当我修改student表中一条记录时,stu_info表中也要修改该条记录
DELIMITER $$
CREATE
TRIGGER myTrigger3 AFTER UPDATE
ON student
FOR EACH ROW BEGIN
UPDATE stu_info SET id = new.id, username = new.username, pwd = new.pwd WHERE id = old.id;
END $$
DELIMITER ;
UPDATE student SET username = '阿乐', pwd = '1234' WHERE id = 5;
SELECT * FROM student;
/*
id username pwd
3 王五 5555
4 赵六 6666
5 阿乐 1234
*/
SELECT * FROM stu_info;
/*
id username pwd
5 阿乐 1234
*/