极速掌握MySQL存储过程,开学秒室友

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 极速掌握MySQL存储过程,开学秒室友

🍁一、 简介



🍃 1.1 原理


我们常用的操作数据库语言 SQL 语句在执行的时候需要要先编译,然后执行,

而存储过程(Stored Procedure)是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它

537dde25fb934bb9b4b7675e9752bc6d.jpg

🍃 1.2 优点


(1).存储过程增强了 SQL 语言的功能和灵活性。

(2).存储过程允许标准组件是编程。

(3).存储过程能实现较快的执行速度。

(4).存储过程能过减少网络流量。

(5).存储过程可被作为一种安全机制来充分利用。


MySQL 5.0 终于开始已经支持存储过程,这样即可以大大提高数据库的处理速度,

同时也可以提高数据库编程的灵活性。


🍁 二、使用



🍃 2.1 常用命令


##删除

drop PROCEDURE pro_count_mysql

##创建

CREATE PROCEDURE pro_count_mysql(OUT P_o_cnt int)

BEGIN

SELECT COUNT(*) INTO P_o_cnt FROM mysql.user;

END;

##调用,给一个变量

call pro_count_mysql(@s);

##查询变量

mysql> select @s;

##数据字典

mysql> SHOW CREATE PROCEDURE proc6;

mysql> SHOW PROCEDURE STATUS --列出所有的存储过程

mysql> show procedure status where db=‘mes_db’;

注:部分版本mysql初始化不允许建存储过程,需要做如下设置

SET GLOBAL log_bin_trust_function_creators = 1;


🍃 2.2 变量定义


#外部变量

mysql> set @p1=‘IT邦德’;

mysql> select @p1;


内部定义变量用declare,如下所示

05cb318d61554533a3391687e3b1cc1a.png


🍃 2.3 参数


in 参数


DELIMITER //
CREATE PROCEDURE demo_in_parameter(IN p_in int)
BEGIN
SELECT p_in;
SET p_in=2;
SELECT p_in;
END;
//
DELIMITER ;
##调用,给一个变量,不影响外面参数的值
call demo_in_parameter(3);
MySQL [db1]> set @p_in=66;
MySQL [db1]> call demo_in_parameter(@p_in);
注意:CMD窗口执行,记得留意空格

8373caa0cfa84b5f8ca65ee7dca114d9.png

inout 参数

##CMD创建
DELIMITER //
CREATE PROCEDURE demo_inout_parameter(INOUT p_inout int)
BEGIN
SELECT p_inout;
SET p_inout=2;
SELECT p_inout;
END;
//
DELIMITER ;
##调用,影响外面传参的值
mysql> SET @p_inout=1;
mysql> CALL demo_inout_parameter(@p_inout);

4bfd55226bc740e6930060773e2738d1.png


🍁 三、实战案例



🍃 3.1 条件语句


mysql> create table t1(id int);


##case 语句
DELIMITER //
CREATE PROCEDURE proc3 (in parameter int)
begin
declare var int;
set var=parameter+1;
case var
when 0 then
insert into t values(17);
when 1 then
insert into t values(18);
else
insert into t values(19);
end case;
end;
//
DELIMITER ;


🍃 3.2 循环语句


mysql> create table t2(id int);


##repeat···· end repeat,它在执行操作后检查结果
DELIMITER //
CREATE PROCEDURE proc5 ()
begin
declare v int;
set v=0;
repeat
insert into t values(v);
set v=v+1;
until v>=5
end repeat;
end;
//
DELIMITER ;
mysql> call proc5;
mysql> select * from t2;

4c90a853b5454a818dc2b4b3f0e4af25.png

🍃 3.3 动态生成表


##学生表

select * from tb_student

7b178fd6431648ba9b14d81192ec557a.png

##成绩表

select * from tb_score


b198a58b9e7d4a91853178d6dd9c6ef3.png

选课表

select * from tb_course

7d48226d5f22403e94c88f612306404e.png


编写一个存储过程,


要求对每门已选课程生成成绩表,表名为课程名,成绩表的字段包括学号、姓名、班级、成绩。

如果能独立完成,证明你的数据库应用能力已经跃上了一个台阶


DROP PROCEDURE create_table_pro;
DELIMITER //
CREATE PROCEDURE create_table_pro()
BEGIN
# 定义接受sql数据的变量
DECLARE courseNo varchar(50);
DECLARE studentNo varchar(20);
DECLARE studentName varchar(20);
DECLARE classNo varchar(20);
DECLARE score int;
# 声明表名称
DECLARE tblname VARCHAR(32);
# 总行数
DECLARE cnt INT DEFAULT 0;
# 循环变量i
DECLARE i INT DEFAULT 0;
declare tmp_cursor cursor for(
select 
c.courseNo,
a.studentNo,
a.studentName,
a.classNo,
b.score from tb_student a,tb_score b,tb_course c
where a.studentNo = b.studentNo
and b.courseNo = c.courseNo
order by 1);
SELECT COUNT(*) INTO cnt from tb_student a,tb_score b,tb_course c
where a.studentNo = b.studentNo
and b.courseNo = c.courseNo;
open tmp_cursor;
 # 开始循环
  REPEAT
    SET i := i+1;
      FETCH tmp_cursor INTO courseNo,studentNo,studentName,classNo,score;
    SET tblname = CONCAT('course_',courseNo);
    SET @delTabl = CONCAT('DELETE FROM ',tblname,' WHERE studentNo=','''',studentNo,'''');
    SET @createTbsql = CONCAT('create table if not exists ',tblname,'(studentNo char(10) not null primary key,
    studentName varchar(10) not null,classNo char(6),credite int) ENGINE=InnoDB DEFAULT CHARSET=GB2312;');
    SET @insertTabl = CONCAT(' insert into ',tblname,' values(',
    '''',studentNo,'''','\,',
    '''',studentName,'''','\,',
    '''',classNo,'''','\,',
    '''',score,'''',
      ')'
    );
    select @insertTabl;
    # 执行动态删除表语句
    PREPARE temp FROM @delTabl;
    EXECUTE temp;
      DEALLOCATE PREPARE temp;
      # 执行动态生成的创建表语句
    PREPARE temp FROM @createTbsql;
    EXECUTE temp;
      DEALLOCATE PREPARE temp;
    # 执行动态表插入语句
    PREPARE temp FROM @insertTabl;
    EXECUTE temp;
      DEALLOCATE PREPARE temp;
      UNTIL i>=cnt END REPEAT;
# 循环结束
close tmp_cursor;
END;
//
DELIMITER ;


fb97bd56280b420793c20b4d3e8bcf23.png

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
存储 SQL NoSQL
|
2月前
|
存储 SQL 关系型数据库
MySql数据库---存储过程
MySql数据库---存储过程
47 5
|
2月前
|
存储 关系型数据库 MySQL
MySQL 存储过程返回更新前记录
MySQL 存储过程返回更新前记录
67 3
|
2月前
|
存储 SQL 关系型数据库
MySQL 存储过程错误信息不打印在控制台
MySQL 存储过程错误信息不打印在控制台
86 1
|
4月前
|
存储 关系型数据库 MySQL
Mysql表结构同步存储过程(适用于模版表)
Mysql表结构同步存储过程(适用于模版表)
54 0
|
4月前
|
存储 SQL 关系型数据库
MySQL 创建存储过程注意项
MySQL 创建存储过程注意项
51 0
|
5月前
|
存储 SQL 关系型数据库
(十四)全解MySQL之各方位事无巨细的剖析存储过程与触发器!
前面的MySQL系列章节中,一直在反复讲述MySQL一些偏理论、底层的知识,很少有涉及到实用技巧的分享,而在本章中则会阐述MySQL一个特别实用的功能,即MySQL的存储过程和触发器。
112 0
|
4天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
18 3
|
4天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
22 3
|
4天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
28 2