12、存储过程、触发器

存储过程

简介

-- 存储过程
/*
类似于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
*/

猜你喜欢

转载自blog.csdn.net/ShawnYue_08/article/details/107876575