一、存储过程的查询
1、通过数据字典表查询
存储过程的定义信息保存在数据字典表information_schema.routines中:

| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22  | 
						<span style="font-size: 16px;">mysql> <span style="color: rgba(0, 0, 255, 1);">select</span><span style="color: rgba(0, 0, 0, 1);"> ROUTINE_NAME, ROUTINE_TYPE     </span>-> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> information_schema.ROUTINES     </span>-> <span style="color: rgba(0, 0, 255, 1);">where</span> ROUTINE_SCHEMA=<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">db1</span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);">; </span>+----------------+--------------+ | routine_name   | routine_type | +----------------+--------------+ | difference     | PROCEDURE    | | inout_param    | PROCEDURE    | | in_param       | PROCEDURE    | | out_param      | PROCEDURE    | | VerboseCompare | FUNCTION     | | Ver_Compare    | FUNCTION     | +----------------+--------------+<span style="color: rgba(0, 0, 0, 1);"> mysql</span>> SELECT name FROM mysql.proc WHERE db=<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">db1</span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);">; </span>+----------------+ | name           | +----------------+ | difference     | | inout_param    | | ……             | +----------------+</span>  | 
					
2、使用show语句查询
SHOW PROCEDURE STATUS WHERE db=’数据库名’;

3、查看存储过程详细的定义信息
SHOW CREATE PROCEDURE 数据库.存储过程名;
二、存储过程的修改
注意:
ALTER {PROCEDURE | FUNCTION}……语句只能改变存储过程的特征,不能修改过程的参数以及过程体。如果想做这样的修改,必须先使用DROP PROCEDURE 删除过程,然后使用and CREATE PROCEDURE重建过程。
| 
					 1 2 3 4 5 6 7  | 
						<span style="font-size: 16px;">ALTER {PROCEDURE |<span style="color: rgba(0, 0, 0, 1);"> FUNCTION} sp_name [characteristic ...] characteristic:   COMMENT </span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">string</span><span style="color: rgba(128, 0, 0, 1);">'</span>   |<span style="color: rgba(0, 0, 0, 1);">LANGUAGE SQL   </span>|{ CONTAINS SQL | NO SQL | READS SQL DATA |<span style="color: rgba(0, 0, 0, 1);"> MODIFIES SQL DATA }   </span>|SQL SECURITY { DEFINER | INVOKER }</span>  | 
					
存储过程的特征characteristic:指定存储的特性
1、COMMENT ‘string’是注释信息;
LANGUAGE SQL是指明过程体是用sql语言编写的,而不是java或php;
2、SQL SECURITY { DEFINER | INVOKER }指明谁有权限来执行:
DEFINER表示只有定义者自己才能够执行;
INVOKER表示调用者可以执行。
在存储过程定义时:
| 
					 1 2 3 4  | 
						<span style="font-size: 16px;"><span style="color: rgba(0, 0, 0, 1);">CREATE     [DEFINER </span>= { user |<span style="color: rgba(0, 0, 0, 1);"> CURRENT_USER }]     PROCEDURE     ……</span></span>  | 
					
[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权限:
| 
					 1 2 3 4  | 
						<span style="font-size: 16px;"><span style="color: rgba(0, 0, 0, 1);">GRANT  EXECUTE         ON PROCEDURE  </span><过程名><span style="color: rgba(0, 0, 0, 1);">     TO  </span><user></span><span style="font-family: 'Microsoft YaHei'; font-size: 18px; line-height: 1.5; background-color: rgba(255, 255, 255, 1);"> </span>  |