1月阅读周·MySQL数据库入门:存储过程的使用之调用和查看存储过程篇

举报
叶一一 发表于 2025/01/24 11:42:39 2025/01/24
【摘要】 背景去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。没有计划的阅读,收效甚微。新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。这个“玩法”虽然常见且板正,但是有效,已经坚持阅读十二个月。已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScr...

背景

去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。

没有计划的阅读,收效甚微。

新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。

这个“玩法”虽然常见且板正,但是有效,已经坚持阅读十二个月。

已读完书籍《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScript(中卷)》、《你不知道的JavaScript(下卷)》、《数据结构与算法JavaScript描述》、《WebKit技术内幕》、《前端架构:从入门到微前端》、《秒懂算法:用常识解读数据结构与算法》、《JavaScript权威指南》、《JavaScript异步编程设计快速响应的网络应用》、《编写可测试的JavaScript代码

当前阅读周书籍MySQL数据库入门

调用存储过程

存储过程有多种调用方法。存储过程必须使用CALL语句调用,并且存储过程和数据库相关,如果要执行其他数据库中的存储过程,需要指定数据库名称。调用存储过程的语法格式如下:

CALL sp_name([parameter[,…]])

上述语法格式中,sp_name为存储过程的名称,parameter为存储过程的参数。

【例1-1】 定义一个名为CountProc1的存储过程,然后调用这个存储过程,具体操作如下:

1.定义存储过程

mysql>DELIMITER //
mysql>CREATE PROCEDURE CountProc1(IN s_gender VARCHAR(50),OUT num INT)
-> BEGIN
-> SELECT COUNT(*) INTO num FROM student WHERE gender= s_gender;
-> END//
Query OK, 0 rows affected (0.13 sec)

mysql>DELIMITER;

2.调用存储过程

mysql>CALL CountProc1("女",@num);
Query OK, 1 row affected (0.17 sec)

3.查看返回结果

mysql>SELECT @num;
+------+
| @num |
+------+
|   2  |
+------+
1 row in set (0.00 sec)

查看存储过程

MySQL存储了存储过程的状态信息,用户可以使用SHOW STATUS语句或SHOW CREATE语句来查看,也可以直接从系统的information_schema数据库中查询。接下来将针对这三种方法进行详细的讲解。

1.SHOW STATUS语句查看存储过程的状态

SHOW STATUS语句可以查看存储过程的状态,其基本语法结构如下:

SHOW {PROCEDURE|FUNCTION} STATUS [LIKE 'pattern']

这个语句是一个MySQL的扩展。它返回子程序的特征,如数据库、名字、类型、创建者及创建、修改日期。如果没有指定样式,根据使用的语句,所有存储程序或存储函数的信息都被列出。上述语法格式中,PROCEDURE和FUNCTION分别表示查看存储过程和函数,LIKE语句表示匹配的名称。

【例1-2】 SHOW STATUS 语句的示例代码如下:

SHOW PROCEDURE STATUS LIKE'C%'\G

代码执行如下:

mysql>SHOW PROCEDURE STATUS LIKE'C%'\G
*************************** 1. row ***************************
  Db: chapter06
Name: CountProc1
Type: PROCEDURE
Definer: @
Modified: 2014-09-27 14:08:32
Created: 2014-09-27 14:08:32
Security_type: DEFINER
Comment:
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.05 sec)

上述代码中“SHOW PROCEDURE STATUS LIKE'C%'\G”语句获取数据库中所有名称以C开头的存储过程的信息。通过上面的语句可以看到,这个存储过程所在的数据库为chapter06,存储过程的名称为CountProc1等相关信息。

2.SHOW CREATE语句查看存储过程的状态

除了SHOW STATUS语句外,MySQL还可以使用SHOW CREATE语句查看存储过程的状态,基本语法格式如下:

SHOW CREATE{PROCEDURE|FUNCTION} sp_name

这个语句也是一个MySQL的扩展。类似于SHOW CREATE TABLE,它返回一个可用来重新创建已命名子程序的确切字符串。

【例1-3】 SHOW CREATE 语句的示例代码如下:

SHOW CREATE PROCEDURE chapter06.CountProc1\G

代码执行如下:

mysql>SHOW CREATE PROCEDURE chapter06.CountProc1\G
*************************** 1. row ***************************
Procedure: CountProc1
sql_mode: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_
      SUBSTITUTION
Create Procedure: CREATE DEFINER="@" PROCEDURE 'CountProc1'(IN s_gender VA
RCHAR(50),OUT num INT)
BEGIN
SELECT COUNT(*) INTO num FROM student WHERE gender = s_gender;
END
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)

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

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

SELECT * FROM  information_schema.Routines
WHERE ROUTINE_NAME='CountProc1' AND ROUTINE_TYPE='PROCEDURE'\G

SQL语句执行结果如下:

mysql>SELECT * FROM information_schema.Routines
->WHERE ROUTINE_NAME='CountProc1' AND ROUTINE_TYPE='PROCEDURE'\G
*************************** 1. row ***************************
SPECIFIC_NAME: CountProc1
ROUTINE_CATALOG: def
ROUTINE_SCHEMA: chapter06
ROUTINE_NAME: CountProc1
ROUTINE_TYPE: PROCEDURE
DATA_TYPE:
CHARACTER_MAXIMUM_LENGTH: NULL
CHARACTER_OCTET_LENGTH: NULL
NUMERIC_PRECISION: NULL
NUMERIC_SCALE: NULL
DATETIME_PRECISION: NULL
CHARACTER_SET_NAME: NULL
COLLATION_NAME: NULL
DTD_IDENTIFIER: NULL
ROUTINE_BODY: SQL
ROUTINE_DEFINITION: BEGIN
SELECT COUNT(*) INTO num FROM student WHERE gender = s_gender;
END
EXTERNAL_NAME: NULL
EXTERNAL_LANGUAGE: NULL
PARAMETER_STYLE: SQL
IS_DETERMINISTIC: NO
SQL_DATA_ACCESS: CONTAINS SQL
SQL_PATH: NULL
SECURITY_TYPE: DEFINER
  CREATED: 2014-09-27 14:08:32
LAST_ALTERED: 2014-09-27 14:08:32
SQL_MODE: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBS
TITUTION
ROUTINE_COMMENT:
  DEFINER: @
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: utf8_general_ci
1 row in set (0.05 sec)

需要注意的是,在information_schema数据库下的Routines表中,存储所有存储过程的定义。使用SELECT语句查询Routine表中的存储过程的定义时,一定要使用ROUTINE_NAME字段指定存储过程的名称,否则将查询出所有存储过程的定义。如果有存储过程和函数名称相同,则需要同时指定ROUTINE_TYPE字段表明查询的是哪种类型的存储程序。

总结

使用存储过程可以使程序执行效率更高、安全性更好,增强程序的可重用性和维护性。

存储过程有多种调用方法。存储过程必须使用CALL语句调用,并且存储过程和数据库相关,如果要执行其他数据库中的存储过程,需要指定数据库名称。

MySQL存储了存储过程的状态信息,用户可以使用SHOW STATUS语句或SHOW CREATE语句来查看,也可以直接从系统的information_schema数据库中查询。


作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏️ | 留言📝

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。