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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 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月前
|
存储 Java 关系型数据库
java调用mysql存储过程
在 Java 中调用 MySQL 存储过程主要借助 JDBC(Java Database Connectivity)。其核心原理是通过 JDBC 与 MySQL 建立连接,调用存储过程并处理结果。具体步骤包括:加载 JDBC 驱动、建立数据库连接、创建 CallableStatement 对象、设置存储过程参数并执行调用。此过程实现了 Java 程序与 MySQL 数据库的高效交互。
|
4月前
|
存储 SQL 关系型数据库
[MySQL]存储过程
本文介绍了存储过程的概念、优点和缺点,并通过具体示例详细讲解了存储过程的创建、使用和调用方法。此外,还介绍了游标的定义和使用,帮助读者更好地理解和应用存储过程。文章旨在为读者提供一个学习和使用存储过程的实用指南。
448 18
[MySQL]存储过程
|
4月前
|
存储 SQL NoSQL
|
5月前
|
存储 SQL 关系型数据库
MySql数据库---存储过程
MySql数据库---存储过程
76 5
|
5月前
|
存储 关系型数据库 MySQL
MySQL 存储过程返回更新前记录
MySQL 存储过程返回更新前记录
117 3
|
5月前
|
存储 SQL 关系型数据库
MySQL 存储过程错误信息不打印在控制台
MySQL 存储过程错误信息不打印在控制台
119 1
|
7月前
|
存储 关系型数据库 MySQL
Mysql表结构同步存储过程(适用于模版表)
Mysql表结构同步存储过程(适用于模版表)
79 0
|
2月前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
1月前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
175 42
|
3天前
|
SQL 关系型数据库 MySQL
MySQL生产环境迁移至YashanDB数据库深度体验
这篇文章是作者将 MySQL 生产环境迁移至 YashanDB 数据库的深度体验。介绍了 YashanDB 迁移平台 YMP 的产品相关信息、安装步骤、迁移中遇到的各种兼容问题及解决方案,最后总结了迁移体验,包括工具部署和操作特点,也指出功能有优化空间及暂不支持的部分,期待其不断优化。