首页 > 编程笔记 > MySQL笔记 阅读:10

MySQL查看存储过程的3种方法(附带实例)

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

SHOW STATUS语句查看存储过程和函数

SHOW STATUS语句可以查看存储过程和函数的状态,其基本语法结构如下:
SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'pattern']
其中,PROCEDURE 和 FUNCTION 分别表示查看存储过程和函数;LIKE 语句表示匹配存储过程或函数的名称。

这个语句是一个 MySQL 的扩展,返回子程序的特征,如数据库、名字、类型、创建者及创建和修改日期。如果没有指定样式,那么根据使用的语句,所有存储程序或存储函数的信息都会被列出。

【实例】SHOW STATUS语句示例,代码如下:
mysql> SHOW PROCEDURE STATUS LIKE 'C%'\G
*** 1. row ***
               Db: test_db
             Name: CountProc
Type: PROCEDURE
          Definer: root@localhost
          Modified: 2018-11-21 13:52:28
          Created: 2018-11-21 13:52:28
     Security_type: DEFINER
          Comment:
character_set_client: gbk
collation_connection: gbk_chinese_ci
  Database Collation: utf8mb4_0900_ai_ci
“SHOW PROCEDURE STATUS LIKE 'C%'\G”语句获取数据库中所有名称以字母“C”开头的存储过程的信息。通过上面的语句可以看到,这个存储函数所在的数据库为 test_db、存储函数的名称为 CountProc 等一些相关信息。

SHOW CREATE语句查看存储过程和函数

除了 SHOW STATUS 之外,MySQL 还可以使用 SHOW CREATE 语句查看存储过程和函数的状态。
SHOW CREATE {PROCEDURE | FUNCTION} sp_name
PROCEDURE和FUNCTION分别表示查看存储过程和函数;sp_name参数表示匹配存储过程或函数的名称。

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

【实例】SHOW CREATE 语句示例,代码如下:
mysql> SHOW CREATE FUNCTION test_db.CountProc2 \G
*************************** 1. row ***************************
          Function: CountProc2
          sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
    Create Function: CREATE DEFINER=`root`@`localhost` FUNCTION `CountProc2`(sid INT) RETURNS
int(11)
   BEGIN
   RETURN (SELECT COUNT(*) FROM fruits WHERE s_id = sid);
   END
   character_set_client: gbk
   collation_connection: gbk_chinese_ci
     Database Collation: utf8mb4_0900_ai_ci
执行上面的语句可以得到存储函数的名称为 CountProc2,sql_mode 为 sql 的模式,Create Function 为存储函数的具体定义语句,还有数据库设置的一些信息。

从information_schema.Routines表中查看存储过程和函数

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

查看的基本语法形式如下:
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME=' sp_name ' ;
其中,ROUTINE_NAME 字段中存储的是存储过程和函数的名称;sp_name 参数表示存储过程或函数的名称。

【实例】从Routines表中查询名称为CountProc2的存储函数的信息,代码如下:
mysql> SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME='CountProc2'  AND
ROUTINE_TYPE = 'FUNCTION' \G
   *************************** 1. row ***************************
            SPECIFIC_NAME: CountProc2
          ROUTINE_CATALOG: def
           ROUTINE_SCHEMA: test_db
             ROUTINE_NAME: CountProc2
             ROUTINE_TYPE: FUNCTION
                DATA_TYPE: int
   CHARACTER_MAXIMUM_LENGTH: NULL
     CHARACTER_OCTET_LENGTH: NULL
         NUMERIC_PRECISION: 10
            NUMERIC_SCALE: 0
        DATETIME_PRECISION: NULL
        CHARACTER_SET_NAME: NULL
           COLLATION_NAME: NULL
           DTD_IDENTIFIER: int(11)
             ROUTINE_BODY: SQL
        ROUTINE_DEFINITION: BEGIN
   RETURN (SELECT COUNT(*) FROM fruits WHERE s_id = sid);
   END
            EXTERNAL_NAME: NULL
         EXTERNAL_LANGUAGE: SQL
          PARAMETER_STYLE: SQL
   IS_DETERMINISTIC: NO
    SQL_DATA_ACCESS: CONTAINS SQL
          SQL_PATH: NULL
     SECURITY_TYPE: DEFINER
          CREATED: 2018-11-21 16:57:09
      LAST_ALTERED: 2018-11-21 16:57:09
          SQL_MODE: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
    ROUTINE_COMMENT:
          DEFINER: root@localhost
CHARACTER_SET_CLIENT: gbk
COLLATION_CONNECTION: gbk_chinese_ci
  DATABASE_COLLATION: utf8mb4_0900_ai_ci
在 information_schema 数据库的 Routines 表中,存储着所有存储过程和函数的定义。使用 SELECT 语句查询 Routines 表中的存储过程和函数的定义时,一定要使用 ROUTINE_NAME 字段指定存储过程或函数的名称。否则,将查询出所有的存储过程或函数的定义。如果有存储过程和存储函数名称相同,就需要同时指定 ROUTINE_TYPE 字段,以表明查询的是哪种类型的存储程序。

相关文章