MySQL学习(17)︱存储过程及实战
存储过程及基本使用
什么是存储过程
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可以通过指定存储过程的名字并给定参数(需要时)来调用执行,类似于编程语言中的方法或函数。
-
存储过程的优点:
1.存储过程是对SQL语句的封装,增强可复用性 2.存储过程可以隐藏复杂的业务逻辑、商业逻辑 3.存储过程支持接收参数,并返回运算结果
-
存储过程的缺点:
1.存储过程的可移植性较差,如果更换数据库,要重写存储过程 2.存储过程难以调试和扩展 3.无法使用Explain对存储过程进行分析 4.《阿里巴巴Java开发手册》中禁止使用存储过程
例子:求两数之和
- 连接数据库,使用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的和
- 连接数据库,使用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;
存储过程实战:给指定用户发邮件通知
- 连接数据库,使用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;