MySQL学习(17)︱存储过程及实战

存储过程及基本使用

什么是存储过程

存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可以通过指定存储过程的名字并给定参数(需要时)来调用执行,类似于编程语言中的方法或函数

  • 存储过程的优点

1.存储过程是对SQL语句的封装,增强可复用性
2.存储过程可以隐藏复杂的业务逻辑、商业逻辑
3.存储过程支持接收参数,并返回运算结果

  • 存储过程的缺点

1.存储过程的可移植性较差,如果更换数据库,要重写存储过程
2.存储过程难以调试和扩展
3.无法使用Explain对存储过程进行分析
4.《阿里巴巴Java开发手册》中禁止使用存储过程

例子:求两数之和

  1. 连接数据库,使用student数据库并查看所有数据表
USE student;
SHOW TABLES;

效果图:
在这里插入图片描述
2. 创建存储过程并调用

DELIMITER //  //声明语句结束符为"//"
CREATE PROCEDURE my_sum(in a int, in b int, out result int) //定义入参和出参
BEGIN //存储过程开始
	SET result = a + b; //用SET给变量赋值
END // 存储过程结束
//
DELIMITER ; //将声明语句结束符还原为";"

CALL my_sum(10, 20, @result); //调用存储过程

SELECT @result;

效果图:
在这里插入图片描述

例子:计算1+2+…+n的和

  1. 连接数据库,使用student数据库并查看所有数据表
USE student;
SHOW TABLES;

效果图:
在这里插入图片描述
2. 创建存储过程并调用

DELIMITER //
CREATE PROCEDURE my_n_sum(in n int, out result int)
BEGIN
	DECLARE i INT DEFAULT 1;
	DECLARE sum INT DEFAULT 0;

	WHILE i <= n DO
		SET sum = sum + i;
		SET i = i + 1;
	END WHILE;
	
	SET result = sum;
END;
//
DELIMITER ;

CALL my_n_sum(100, @result);

SELECT @result;

效果图:
在这里插入图片描述

存储过程实战:给指定用户发邮件通知

  1. 连接数据库,使用student数据库并查看所有数据表
USE student;
SHOW TABLES;

效果图:
在这里插入图片描述
2. 创建两个数据表并向其中一个表插入两条记录

DROP TABLE IF EXISTS user_info;
DROP TABLE IF EXISTS email_info;

CREATE TABLE user_info(
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	name VARCHAR(30),
	email VARCHAR(50)
);

INSERT INTO user_info(id, name, email) VALUES(1, "王一", "wangyi@qq.com");
INSERT INTO user_info(id, name, email) VALUES(2, "张三", "zhangsan@qq.com");

CREATE TABLE email_info(
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	email VARCHAR(50),
	content TEXT,
	send_time DATETIME
);

效果图:
在这里插入图片描述
3. 查看两张数据表的所有记录

SELECT * FROM user_info;
SELECT * FROM email_info;

效果图:
在这里插入图片描述
4. 使用常规方法模拟发送邮件

//常规方法
SELECT email FROM user_info WHERE id = 1;
INSERT INTO email_info(email, content, send_time) VALUES('wangyi@qq.com', '你好!', now());
SELECT * FROM email_info;

效果图:
在这里插入图片描述
5. 使用存储过程方法模拟发送邮件

//存储过程:根据用户id和邮件内容content给用户发邮件
DELIMITER //
CREATE PROCEDURE send_email(in user_id int, in content text)
BEGIN
	/*根据用户id查询邮箱email*/
	SET @user_email = (SELECT email FROM user_info WHERE id = user_id);
	/*模拟发送邮件*/
	INSERT INTO email_info(email, content, send_time) VALUES(@user_email, content, now());
END;
//
DELIMITER ;

SELECT * FROM email_info;

CALL send_email(1, '哈哈!'); //调用存储过程,模拟发送邮件

SELECT * FROM email_info;

CALL send_email(2, '再见!'); //同上

SELECT * FROM email_info;

效果图:
在这里插入图片描述
注:本文是博主MySQL学习的总结,不支持任何商用,转载请注明出处!如果你也对MySQL学习有一定的兴趣和理解,欢迎随时找博主交流~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值