加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

如何查看创建的存储过程(10)

(2010-07-01 12:02:00)
标签:

杂谈

分类: Mysql

到目前为止,我们已经创建了很多的存储过程了,他们也都保存在mysql数据库中,如果我们要查看mysql实际上保存了什么信息,可以有四种方法,两种使用show语句,两种使用select语句,他们的格式如下:
SHOW CREATE PROCEDURE / SHOW CREATE FUNCTION
SHOW PROCEDURE STATUS / SHOW FUNCTION STATUS
SELECT FROM MYSQL.PROC
SELECT FROM INFORMATION_SCHEMA
下面针对以上几种语句举例说明一下。
1、使用show create procedure获得存储过程的信息,和show create table等mysql语法类似,这条语句不返回创建时设定的返回值,而是返回过程的语句信息:

mysql> show create procedure pro1//
+———–+———-+——————————————————————————————————————————————————————————————-+
| Procedure | sql_mode | Create Procedure                                                                                                                                                                          |
+———–+———-+——————————————————————————————————————————————————————————————-+
| pro1              | CREATE ` PROCEDURE `pro1`()
begin
declare x int;
declare y int;
set x=2;
set y=2;
insert into t1(filed) values(a);
select filed * a from t1 where filed >=b;
end |
+———–+———-+——————————————————————————————————————————————————————————————-+
1 row in set (0.00 sec)

mysql> show create procedure p1//
+———–+———-+———————————————————————-+
| Procedure | sql_mode | Create Procedure                                                     |
+———–+———-+———————————————————————-+
| p1                | CREATE ` PROCEDURE `p1`()
select * from db1 |
+———–+———-+———————————————————————-+
1 row in set (0.00 sec)

2、执行show procedure status,这种方法可以返回更多信息的细节:
mysql> show procedure status like ‘pro1′//
+—–+——+———–+—————-+———————+———————+—————+———+
| Db | Name | Type      | Definer        | Modified            | Created             | Security_type | Comment |
+—–+——+———–+—————-+———————+———————+—————+———+
| db1 | pro1 | PROCEDURE | | 2010-06-26 10:20:45 | 2010-06-26 10:20:45 | DEFINER              |
+—–+——+———–+—————-+———————+———————+—————+———+
1 row in set (0.00 sec)

mysql> show procedure status like ‘p1′//
+—–+——+———–+—————-+———————+———————+—————+———+
| Db | Name | Type      | Definer        | Modified            | Created             | Security_type | Comment |
+—–+——+———–+—————-+———————+———————+—————+———+
| db1 | p1   | PROCEDURE | | 2010-06-24 15:52:53 | 2010-06-24 15:52:53 | DEFINER              |
+—–+——+———–+—————-+———————+———————+—————+———+
1 row in set (0.00 sec)

3、使用select可以获得更多的信息
mysql> select * from mysql.proc where name=’pro1′//
+—–+——+———–+—————+———-+—————–+——————+—————+————+———+————————————————————————————————————————————–+—————-+———————+———————+———-+———+
| db | name | type      | specific_name | language | sql_data_access | is_deterministic | security_type | param_list | returns | body                                                                                                                                 | definer        | created             | modified            | sql_mode | comment |
+—–+——+———–+—————+———-+—————–+——————+—————+————+———+————————————————————————————————————————————–+—————-+———————+———————+———-+———+
| db1 | pro1 | PROCEDURE | pro1          | SQL      | CONTAINS_SQL    | NO               | DEFINER                        | begin
declare x int;
declare y int;
set x=2;
set y=2;
insert into t1(filed) values(a);
select filed * a from t1 where filed >=b;
end | | 2010-06-26 10:20:45 | 2010-06-26 10:20:45 |                 |
+—–+——+———–+—————+———-+—————–+——————+—————+————+———+————————————————————————————————————————————–+—————-+———————+———————+———-+———+
1 row in set (0.01 sec)

4、以上三种方式并不是特别的完善,其实最好的方式是select from information_schema。这种方式是“ANSI/ISO标准”的方式完成工作。这是最好的实现方式,其他的方式可能会出现错误。
    在其他的DBMS中,比如SQL server2000,使用information_schema,而只有mysql使用show方式。
    访问mysql.proc的特权是不安全的,因为用户访问information_schema视图的特权,每个用户默认对information_schema数据库有select权限。
    select功能很多,可以计算表达式,分组,排序,产生可以获取信息的结果集,而这些功能show没有。
    所以使用select还是最好的!下面看几个例子,首先使用select information_schema来显示information_schema例程中有哪些列:
mysql> select table_name,column_name,column_type from information_schema.columns where table_name=’routines’//
+————+——————–+————–+
| table_name | column_name        | column_type |
+————+——————–+————–+
| ROUTINES   | SPECIFIC_NAME      | varchar(64) |
| ROUTINES   | ROUTINE_CATALOG    | varchar(512) |
| ROUTINES   | ROUTINE_SCHEMA     | varchar(64) |
| ROUTINES   | ROUTINE_NAME       | varchar(64) |
| ROUTINES   | ROUTINE_TYPE       | varchar(9)   |
| ROUTINES   | DTD_IDENTIFIER     | varchar(64) |
| ROUTINES   | ROUTINE_BODY       | varchar(8)   |
| ROUTINES   | ROUTINE_DEFINITION | longtext     |
| ROUTINES   | EXTERNAL_NAME      | varchar(64) |
| ROUTINES   | EXTERNAL_LANGUAGE | varchar(64) |
| ROUTINES   | PARAMETER_STYLE    | varchar(8)   |
| ROUTINES   | IS_DETERMINISTIC   | varchar(3)   |
| ROUTINES   | SQL_DATA_ACCESS    | varchar(64) |
| ROUTINES   | SQL_PATH           | varchar(64) |
| ROUTINES   | SECURITY_TYPE      | varchar(7)   |
| ROUTINES   | CREATED            | datetime     |
| ROUTINES   | LAST_ALTERED       | datetime     |
| ROUTINES   | SQL_MODE           | longtext     |
| ROUTINES   | ROUTINE_COMMENT    | varchar(64) |
| ROUTINES   | DEFINER            | varchar(77) |
+————+——————–+————–+
20 rows in set (0.00 sec)
    格式整齐吧,当我们要看information_schema视图时,从information_schema中select信息,就像从tables和
columns获取一样,获取的是元数据的数据元素。再比如看一下数据库db1中已经定义了多少存储过程:
mysql> select count(*) from information_schema.routines where routine_schema=’db1′//
+———-+
| count(*) |
+———-+
      35 |
+———-+
1 row in set (0.00 sec)
    已经定义了35条。
    Access control for the ROUTINE_DEFINITION column ROUTINE_DEFINITION列的访问控制
   在INFORMATION_SCHEMA中的ROUTINE_DEFINITION列是由过程或函数组成过程体获得的。这里可能会有一些敏感信息,因此只对过程创建者可见。
    CURRENT_USER <> INFORMATION_SCHEMA.ROUTINES.DEFINER:如果对它使用SELECT的用户不是创建它的用户,那么mysql将返回NULL值,而不是ROUTINE_DEFINITION列。
    显示过程状态子句中的辅助句子
    既然能够显示information_schema.routines中的列,那么现在可以详细解释一下show procedure status中显示的细节,首先看语法:
    show procedure status[where condition];语句中的条件判断和select语句一样,如果为真,则在输出中返回行,需要注意,在where子句中必须使用information_schema列的名字,在结果中显示show procedure status字段的名字。例如:
mysql> show procedure status where name=’pro1&prime;//
+—–+——+———–+—————-+———————+———————+—————+———+
| Db | Name | Type      | Definer        | Modified            | Created             | Security_type | Comment |
+—–+——+———–+—————-+———————+———————+—————+———+
| db1 | pro1 | PROCEDURE | | 2010-06-26 10:20:45 | 2010-06-26 10:20:45 | DEFINER              |
+—–+——+———–+—————-+———————+———————+—————+———+
1 row in set (0.00 sec)

mysql> show procedure status where name=’p1&prime;//
+—–+——+———–+—————-+———————+———————+—————+———+
| Db | Name | Type      | Definer        | Modified            | Created             | Security_type | Comment |
+—–+——+———–+—————-+———————+———————+—————+———+
| db1 | p1   | PROCEDURE | | 2010-06-24 15:52:53 | 2010-06-24 15:52:53 | DEFINER              |
+—–+——+———–+—————-+———————+———————+—————+———+
1 row in set (0.01 sec)
mysql> show procedure status where db=’db1&prime;// 这条语句显示了我们所有创建的存储过程,内容在这里我就不列出来了!!

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有