MySQL——事务与存储过程(三)存储过程的使用(2) 查看存储过程
MySQL存储了存储过程的状态信息,用户可以使用 SHOW STATUS 语句或 SHOW CREATE 语句来查看,也可以直接从系统的 information_schema 数据库中查询。接下来将针对这三种方法进行详细的讲解。
1.SHOW STATUS 语句查看存储过程的状态
SHOW STATUS语句可以查看存储过程的状态,其基本语法结构如下:
SHOW [PROCEDURE|FUNCTION] STATUS [LIKE 'pattern']
这个语句是一个 MySQL 的扩展。它返回子程序的特征,如数据库、名字、类型、创建者及创建、修改日期,如果没有指定样式,根据使用的语句,所有存储程序或存储函数的信息都被列出。上述语法格式中,PROCEDURE 和 FUNCTION 分别表示查看存储过的和函数,LIKE语句表示匹配的名称。
例如, SHOW STATUS 语句的示例代码如下:
SHOW PROCEDURE STATUS LIKE'C%'\G
代码执行如下:
mysql> SHOW PROCEDURE STATUS LIKE'C%'\G
*************************** 1. row ***************************
Db: chapter06
Name: CountProc1
Type: PROCEDURE
Definer: 0
Modified: 2024-07-27 08:50:35
Created: 2024-07-27 08:50:35
Security_type: DEFINER
Comment:
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
Database Collation: utf8mb4_0900_ai_ci
1 row in set (0.00 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,它返回一个可用来重新创建已命名子程序的确切字符串。
例如,SHOW CREATE 语句的示例代码如下:
SHOW CREATE PROCEDURE chapter06.CountProc1\G
代码执行如下:
mysql> SHOW CREATE PROCEDuRE chapter06.CountProc1\G
*************************** 1. row ***************************
Procedure: CountProcl
sql_mode: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_
SUBSTITUTION
Create Procedure: CREATE DEFINER="@" PROCEDURE 'CountProcl'(IN s_gender VARCHAR(50),OUT num INT)
BEGIN
SELECT COUNT(*) INTO num FROM student WHERE gender =s_gender;
END
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
Database Collation: utf8mb4_0900_ai_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: CountProcl
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_DEFINTION: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:2024-07-27 08:50:35
LAST_ALTERED:2024-07-27 08:50:35
SQL MODE: STRICT_TRANS_TABLES,NO_AUTO_CREATE USER,NO_ENGINE SUBSTITUTION
ROUTINE_COMMENT :
DEFINER: @
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
Database Collation: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
需要注意的是,在 information_schema 数据库下的 Routines 表中,存储所有存储过程的定义。使用 SELECT 语句查询 Routine 表中的存储过程的定义时,一定要使用ROUTINE_NAME 字段指定存储过程的名称,否则将查询出所有存储过程的定义。如果有存储过程和函数名称相同,则需要同时指定 ROUTINE_TYPE 字段表明査询的是哪种类型的存储程序。