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

存储过程及基本使用

什么是存储过程

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

    存储过程的优点:
1.存储过程是对SQL语句的封装,增强可复用性 2.存储过程可以隐藏复杂的业务逻辑、商业逻辑 3.存储过程支持接收参数,并返回运算结果
    存储过程的缺点:
1.存储过程的可移植性较差,如果更换数据库,要重写存储过程 2.存储过程难以调试和扩展 3.无法使用Explain对存储过程进行分析 4.《阿里巴巴Java开发手册》中禁止使用存储过程

例子:求两数之和

  1. 连接数据库,使用student数据库并查看所有数据表
USE student;
SHOW TABLES;
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;
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;
SELECT * FROM user_info;
SELECT * FROM email_info;
//存储过程:根据用户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;
经验分享 程序员 微信小程序 职场和发展