一、存储过程的查询
1、通过数据字典表查询
存储过程的定义信息保存在数据字典表information_schema.routines中:
mysql> select ROUTINE_NAME, ROUTINE_TYPE
-> from information_schema.ROUTINES
-> where ROUTINE_SCHEMA='db1';
+----------------+--------------+
| routine_name | routine_type |
+----------------+--------------+
| difference | PROCEDURE |
| inout_param | PROCEDURE |
| in_param | PROCEDURE |
| out_param | PROCEDURE |
| VerboseCompare | FUNCTION |
| Ver_Compare | FUNCTION |
+----------------+--------------+
mysql> SELECT name FROM mysql.proc WHERE db='db1';
+----------------+
| name |
+----------------+
| difference |
| inout_param |
| …… |
+----------------+
2、使用show语句查询
SHOW PROCEDURE STATUS WHERE db='数据库名';
3、查看存储过程详细的定义信息
SHOW CREATE PROCEDURE 数据库.存储过程名;
二、存储过程的修改
注意:
ALTER {PROCEDURE | FUNCTION}……语句只能改变存储过程的特征,不能修改过程的参数以及过程体。如果想做这样的修改,必须先使用DROP PROCEDURE 删除过程,然后使用and CREATE PROCEDURE重建过程。
ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]
characteristic:
COMMENT 'string'
|LANGUAGE SQL
|{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
|SQL SECURITY { DEFINER | INVOKER }
存储过程的特征characteristic:指定存储的特性
1、COMMENT 'string'是注释信息;
LANGUAGE SQL是指明过程体是用sql语言编写的,而不是java或php;
2、SQL SECURITY { DEFINER | INVOKER }指明谁有权限来执行:
DEFINER表示只有定义者自己才能够执行;
INVOKER表示调用者可以执行。
在存储过程定义时:
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE
……
[DEFINER = { user | CURRENT_USER }]:指定存储过程的定义者,指定CURRENT_USER和不指定定义者选项的效果是一样的
3、{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:
MySQL现在不使用:
CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句;
NO SQL表示子程序中不包含SQL语句;
READS SQL DATA表示子程序中包含读数据的语句;
MODIFIES SQL DATA表示子程序中包含写数据的语句。
三、存储过程的删除
DROP PROCEDURE [IF EXISTS] db_name.sp_name;
如果是在当前数据库中的存储过程:DROP PROCEDURE [过程1[,过程2…]]
从MySQL的表格中删除一个或多个存储过程。
四、存储过程的安全
不是每个用户都可以调用一个存储过程;一个用户想调用其它用户创建的过程,必须被授予过程的execute权限:
GRANT EXECUTE ON PROCEDURE <过程名> TO <user>