1月阅读周·MySQL数据库入门:存储过程的使用之调用和查看存储过程篇
背景
去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。
没有计划的阅读,收效甚微。
新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出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畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)