14.3查看存储过程和函数
存储过程和函数创建以后,用户可以査看存储过程和函数的状态和定义。用户可以通过SHOW STATUS语句来查看存储过程和函数的状态,也可以通过SHOW CREATE语句来查看存储过程和函数的定义。用户也可以通过查询information_schema数据库下的Routines表来查看存储过程和函数的信息。本小节将详细讲解查看存一储过程和函数的状态与定义的方法。
14.3.1 SHOW STATUS语句查看存储过程和函数的状态
MySQL中可以通过SHOW STATUS语句查看存储过程和函数的状态。其基本语法形式如下:
SHOW { PROCEDURE | FUNCTION } STATUS [ LIKE ' pattern '];
其中,PROCEDURE参数表示查询存储过程;FUNCTION参数表示查询存储函数;LIKE' pattem '参数用来匹配存储过程或函数的名称。
【示例14-21】下面查询名为num_from_employee的存储过程的状态。代码执行如下:
mysql> SHOW PROCEDURE STATUS LIKE 'num_from_employee'\G *********************************1.row************************ Db: example Name: num_from_employee Type: PROCEDURE Definer: root@localhost Modified: 2009-10-29 21:44:39 Created: 2009-10-29 21:44:39 Security_type: DEFINER Comment: character_set_client: latin1 collation_connection: latin1_swedish_ci Database Collation: utf8_general_ci 1 row in set (0.00 sec)
査询结果显示了存储过程的创建时间、修改时间和字符集等信息。
14.3.2 SHOW CREATE语句查看存储过程和函数的定义
MySQL中可以通过SHOW CREATE语句查看存储过程和函数的状态。其基本语法形式如下:
SHOW CREATE { PROCEDURE | FUNCTION } sp_name ;
其中,PROCEDURE参数表示查询存储过程;FUNCTION参数表示查询存储函数;sp_name参数表示存储过程或函数的名称。
【示例14-22】下面查询名为num_from_employee的存储过程的状态。代码执行如下:
mysql> SHOW CREATE PROCEDURE num_from_employee \G *****************************1.row********************* Procedure: num_from_employee sql_mode: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION Create Procedure: CREATE DEFINER='root'@localhost' PROCEDURE 'num_from_employee' (IN emp_id INT, OUT count_num INT) READS SQL DATA BEGIN SELECT COUNT(*) INTO count_num FROM employee WHERE d_id=emp_id ; END character_set_client: latin1 collation_connection: latin1_swedish_ci Database Collation: utf8_general_ci 1 row in set (0.00 sec)
査询结果显示了存储过程的定义、字符集等信息。
注意:SHOW STATUS语句只能查看存储过程或函数是操作哪一个数据库、存储过程或函数的名称、类型、谁定义的、创建和修改时间、字符编码等信息。但是,这个语句不能查询存储过程或函数的具体定义。如果需要查看详细定义,需要使用 SHOW CREATE语句。
14.3.3 从information_schema.Routines 表中查看存储过程和函数的信息
存储过程和函数的信息存储在information_schema数据库下的Routines表中。可以通过查询该表的记录来查询存储过程和函数的信息。其基本语法形式如下:
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME='sp_name';
其中,ROUTINE_NAME字段中存储的是存储过程和函数的名称;sp_name参数表示存储过程或函数的名称。
【示例14-23】下面从Routines表中查询名为num_from_employee的存储过程的信息。代码执行如下:
mysql> SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME='num_ from_employee' \G **********************************1.row****************************************** SPECIFIC_NAME: num_from_employee ROUTINE_CATALOG: def ROUTINE_SCHEMA: example ROUTINE_NAME: num_from_employee ROUTINE_TYPE: PROCEDURE DATA_TYPE: CHARACTER_MAXIMUM_LENGTH: NULL CHARACTER_OCTET_LENGTH: NULL NUMERiC_PRECiSION: NULL NUMERIC_SCALE: NULL CHARACTER_SET_NAME: NULL COLLATION_NAME: NULL DTD_IDENTiFIER: NULL ROUTINE_BODY: SQL ROUTINE_DEFINITION: BEGIN SELECT COUNT(*) INTO count_num FROM employee WHERE d_id=emp_id ; END EXTERNAL_NAME: NULL EXTERNAL_LANGUAGE: NULL PARAMEfER_STVLE: SQL IS_DETERMINISTIC: NO SQL_DATA_ACCESS: READS SQL DATA SQL_PATH: NULL SECURITY__TYPE: DEFINER CREATED: 2009-10-29 21:44:39 LAST_ALTERED: 2009-10-29 21:44:39 SQL_MODE: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION_ROUTINE_COMMENT: DEFINER: root@localhost CHARACTER_SET_CLIENT: latin1 COLLATION_CONNECTION: latin1_swedish_ci DATABASE_COLLATION: utf8_general_ci 1 row in set (0.00 sec)
查询结果显示num_from_employee的详细信息。
注意:在information_schema数据库下的Routines表中,存储着所有存储过程和函数的定义。如果使用SELECT语句查询Rountines表中的存储过程和函数的定义时,一定要使用ROUTEME_NAME字段指定存储过程或函数的名称。否则,将查询出 所有的存储过程或函数的定义。