15章MySQL:存储过程

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 15章MySQL:存储过程

1、参数分类

存储过程的参数类型可以是IN、OUT和INOUT。根据这点分类如下:


1、没有参数(无参数无返回)

2、仅仅带 IN 类型(有参数无返回)

3、仅仅带OUT 类型(无参数有返回)

4、既带 IN 又带 OUT(有参数有返回)

5、带INOUT(有参数有返回)


注意: IN、OUT、INOUT 都可以在一个存储过程中带多个。


2、创建存储过程

语法:


CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...)
[characteristics ...]
BEGIN
  存储过程体
END


说明:


IN:当前参数为输入参数,也就是表示入参;


存储过程只是读取这个参数的值。如果没有定义参数种类,默认就是 IN,表示输入参数。


OUT:当前参数为输出参数,也就是表示出参;


执行完成之后,调用这个存储过程的客户端或者应用程序就可以读取这个参数返回的值了。


INOUT:当前参数既可以为输入参数,也可以为输出参数。


编写存储过程并不是一件简单的事情,可能存储过程中需要复杂的 SQL 语句。


1. BEGIN…END:
   BEGIN…END 中间包含了多个语句,每个语句都以(;)号为结束符。
2. DECLARE:
   DECLARE 用来声明变量,使用的位置在于 BEGIN…END 语句中间,而且需要在其他语句使用之前进行变量的声明。
3. SET:赋值语句,用于对变量进行赋值。
4. SELECT… INTO:把从数据表中查询的结果存放到变量中,也就是为变量赋值。


设置新的结束标记


DELIMITER 新的结束标记


因为MySQL默认的语句结束符号为分号是 ; 。为了避免与存储过程中SQL语句结束符相冲突,需要使用DELIMITER改变存储过程的结束符。


示例:


#建议新的结束标记不要太花里胡哨了
DELIMITER $
CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名  参数类型,...)
[characteristics ...]
BEGIN
  sql语句1;
  sql语句2;
END $


3、调用存储过程

语法:


CALL 存储过程名(实参列表)


格式:


1、调用in模式的参数:


CALL sp1('值');


2、调用out模式的参数:


SET @name;
CALL sp1(@name);
SELECT @name;


3、调用inout模式的参数:


SET @name=值;
CALL sp1(@name);
SELECT @name;


4、删除存储过程

语法结构:


DROP PROCEDURE [IF EXISTS] 存储过程名


5、查看存储过程

1. 使用SHOW CREATE语句查看存储过程和函数的创建信息


语法结构:


SHOW CREATE PROCEDURE  存储过程名


2. 使用SHOW STATUS语句查看存储过程和函数的状态信息


语法结构:


SHOW PROCEDURE  STATUS [LIKE 'pattern']


这个语句返回子程序的特征,如数据库、名字、类型、创建者及创建和修改日期。


[LIKE 'pattern']匹配存储过程的名称,可以省略。当省略不写时,会列出MySQL数据库中存在的所有存储过程的信息。


举例:


#查询名称以select开头的存储过程
mysql> SHOW PROCEDURE STATUS LIKE 'SELECT%';
*************************** 1. row ***************************
                  Db: test_db
                Name: SelectAllData
                Type: PROCEDURE
             Definer: root@localhost
            Modified: 2021-10-16 15:55:07
             Created: 2021-10-16 15:55:07
       Security_type: DEFINER
             Comment: 
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
  Database Collation: utf8mb4_general_ci


3. 从information_schema.Routines表中查看存储过程的信息


MySQL中存储过程的信息存储在information_schema数据库下的Routines表中。可以通过查询该表的记录来查询存储过程和函数的信息。


语法结构:


SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME='存储过程的名' [AND ROUTINE_TYPE = 'PROCEDURE'];


说明: 如果在MySQL数据库中存在存储过程和函数名称相同的情况,最好指定ROUTINE_TYPE查询条件来指明查询的是存储过程还是函数。


6、修改存储过程

修改存储过程,不影响存储过程功能,只是修改相关特性。使用ALTER语句实现。


ALTER PROCEDURE  存储过程名;


7、练习题加强

#准备工作
CREATE TABLE admin (
          id INT PRIMARY KEY AUTO_INCREMENT,
          user_name VARCHAR (15) NOT NULL,
          pwd VARCHAR (25) NOT NULL
) ;
 CREATE TABLE beauty (
          id INT PRIMARY KEY AUTO_INCREMENT,
          NAME VARCHAR (15) NOT NULL,
          phone VARCHAR (15) UNIQUE,
          birth DATE
) ;
INSERT INTO beauty(NAME,phone,birth) VALUES 
('朱茵','13201233453','1982-02-12'), 
('孙燕姿','13501233653','1980-12-09'), 
('田馥甄','13651238755','1983-08-21'), 
('邓紫棋','17843283452','1991-11-12'), 
('刘若英','18635575464','1989-05-18'), 
('杨超越','13761238755','1994-05-11');



#1. 创建存储过程insert_user(),实现传入用户名和密码,插入到admin表中 
DELIMITER $  #‘$’代表着语句的结束
CREATE PROCEDURE insert_user(IN username VARCHAR(15),IN `password` VARCHAR(25))
BEGIN 
  INSERT INTO admin VALUES (username,`password`);
END $  #存储过程结束
DELIMITER ;  #修改语句结束的标识符为‘;’


#2. 创建存储过程get_phone(),实现传入女神编号,返回女神姓名和女神电话 
DELIMITER $
CREATE PROCEDURE get_phone(IN id INT,OUT bname VARCHAR(15),OUT bphone VARCHAR(15))
BEGIN
  SELECT beauty.name , beauty.phone 
        INTO bname,bphone
  FROM beauty WHERE beauty.id = id;
END $
DELIMITER ;
#调用
CALL get_phone(1,@name,@phone);
SELECT @name , @phone;


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
24天前
|
存储 SQL NoSQL
|
1月前
|
存储 SQL 关系型数据库
MySql数据库---存储过程
MySql数据库---存储过程
37 5
|
1月前
|
存储 关系型数据库 MySQL
MySQL 存储过程返回更新前记录
MySQL 存储过程返回更新前记录
54 3
|
1月前
|
存储 SQL 关系型数据库
MySQL 存储过程错误信息不打印在控制台
MySQL 存储过程错误信息不打印在控制台
66 1
|
3月前
|
存储 关系型数据库 MySQL
Mysql表结构同步存储过程(适用于模版表)
Mysql表结构同步存储过程(适用于模版表)
48 0
|
3月前
|
存储 SQL 关系型数据库
MySQL 创建存储过程注意项
MySQL 创建存储过程注意项
42 0
|
4月前
|
存储 SQL 关系型数据库
(十四)全解MySQL之各方位事无巨细的剖析存储过程与触发器!
前面的MySQL系列章节中,一直在反复讲述MySQL一些偏理论、底层的知识,很少有涉及到实用技巧的分享,而在本章中则会阐述MySQL一个特别实用的功能,即MySQL的存储过程和触发器。
|
4月前
|
存储 SQL 数据库
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
|
5月前
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)
|
5月前
|
存储 SQL 关系型数据库
MySQL存储过程和存储函数的使用
MySQL的存储过程和存储函数在功能和用法上有明显的区别。存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,通过指定名称和参数(如果有)来调用执行,可以返回多个值或结果集,但不直接返回值。而存储函数则是一个有返回值的特殊存储过程,它返回一个值或表对象,可以直接嵌入SQL语句中使用,如SELECT语句中。两者都是为了提高SQL代码的重用性和性能,但使用场景和方式有所不同。
4295 4
下一篇
无影云桌面