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: chapter06Name: CountProc1Type: PROCEDUREDefiner: 0Modified: 2024-07-27 08:50:35Created: 2024-07-27 08:50:35Security_type: DEFINERComment:
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ciDatabase 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: CountProclsql_mode: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONCreate 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_ciDatabase 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: CountProc1ROUTINE_CATALOG: defROUTINE_SCHEMA: chapter06ROUTINE_NAME: CountProclROUTINE_TYPE: PROCEDUREDATA_TYPE:CHARACTER_MAXIMUM_LENGTH: NULLCHARACTER_OCTET_LENGTH: NULLNUMERIC_PRECISION: NULLNUMERIC_SCALE: NULLDATETIME_PRECISION: NULLCHARACTER_SET_NAME: NULLCOLLATION_NAME: NULLDTD_IDENTIFIER: NULLROUTINE_BODY: SQLROUTINE_DEFINTION:BEGIN
SELECT COUNT(*)INTO num FROM student WHERE gender =s_gender;
ENDEXTERNAL_NAME: NULLEXTERNAL_LANGUAGE: NULLPARAMETER_STYLE: SQLIS_DETERMINISTIC: NOSQL_DATA_ACCESS: CONTAINS SQLSQL_PATH: NULLSECURITY_TYPE: DEFINERCREATED:2024-07-27 08:50:35LAST_ALTERED:2024-07-27 08:50:35SQL MODE: STRICT_TRANS_TABLES,NO_AUTO_CREATE USER,NO_ENGINE SUBSTITUTIONROUTINE_COMMENT :DEFINER: @
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ciDatabase Collation: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
需要注意的是,在 information_schema 数据库下的 Routines 表中,存储所有存储过程的定义。使用 SELECT 语句查询 Routine 表中的存储过程的定义时,一定要使用ROUTINE_NAME 字段指定存储过程的名称,否则将查询出所有存储过程的定义。如果有存储过程和函数名称相同,则需要同时指定 ROUTINE_TYPE 字段表明査询的是哪种类型的存储程序。