一、存儲過程的查詢
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>
