information_schema.Routines WHERE ROUTINE_NAME='name_from_t3'
SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE CHARACTER_SET_NAME COLLATION_NAME DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE CREATED LAST_ALTERED SQL_MODE ROUTINE_COMMENT DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION
------------- --------------- -------------- ------------ ------------ --------- ------------------------ ---------------------- ----------------- ------------- ------------------ --------------- -------------- ------------ ---------------------------------------------- ------------- ----------------- --------------- ---------------- --------------- -------- ------------- ------------------- ------------------- -------- --------------- -------------- -------------------- -------------------- ------------------
name_from_t3 def school name_from_t3 FUNCTION char 80 240 (NULL) (NULL) utf8 utf8_general_ci char(80) SQL RETURN (SELECT NAME FROM t3 WHERE id=id ) (NULL) (NULL) SQL NO CONTAINS SQL (NULL) DEFINER 2014-06-21 18:52:39 2014-06-21 18:52:39 root@localhost utf8 utf8_general_ci utf8_general_ci
查询结果显示name_from_t3的详细信息。
?
注意:在information_schema数据库下的Routines表中,存储着所有存储过程和函数的定义。
如果使用SELECT语句查询Routines表中的存储过程和函数的定义时,一定要使用ROUTINE_NAME字段指定存储过程或函数的名称。
否则,将查询出所有的存储过程或函数的定义。
修改存储过程和函数
修改存储过程和函数是指修改已经定义好的存储过程和函数。
MySQL中通过ALTER PROCEDURE语句来修改存储过程。
通过ALTER FUNCTION语句来修改存储函数。
MySQL中修改存储过程和函数的语句的语法形式如下:
ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]
characteristic:
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
其中,sp_name参数表示存储过程或函数的名称;
characteristic参数指定存储函数的特性。
CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句;
NO SQL表示子程序中不包含SQL语句;
READS SQL DATA表示子程序中包含读数据的语句;
MODIFIES SQL DATA表示子程序中包含写数据的语句。
SQL SECURITY { DEFINER | INVOKER }指明谁有权限来执行。
DEFINER表示只有定义者自己才能够执行;
INVOKER表示调用者可以执行。
COMMENT 'string'是注释信息。
说明:修改存储过程使用ALTER PROCEDURE语句,修改存储函数使用ALTER FUNCTION语句。
但是,这两个语句的结构是一样的,语句中的所有参赛都是一样的。
而且,它们与创建存储过程或函数的语句中的参数也是基本一样的。
?
修改存储过程和函数,只能修改他们的权限,目前MYSQL还不提供对已存在的存储过程和函数代码的修改
如果要修改,只能通过先DROP掉,然后重新建立新的存储过程和函数来实现
在SQLYOG里选中选中函数,然后右键ALTER FUNCTION的时候,也是这样,先DROP掉,然后重新建立新的函数来实现

DELIMITER $$
DROP FUNCTION IF EXISTS `name_from_t3`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `name_from_t3`(id INT ) RETURNS CHAR(80) CHARSET utf8
RETURN (SELECT NAME FROM t3 WHERE id=id )$$
DELIMITER ;
?
删除存储过程和函数
删除存储过程和函数指删除数据库中已经存在的存储过程和函数。
MySQL中使用DROP PROCEDURE语句来删除存储过程。通过DROP FUNCTION语句来删除存储函数。
DROP { PROCEDURE| FUNCTION } sp_name;
其中,sp_name参数表示存储过程或函数的名称
下面删除存储过程Proc和存储函数name_from_t3。删除存储过程的代码如下:
DROP PROCEDURE Proc;
删除存储函数name_from_employee的代码如下:
DROP FUNCTION name_from_t3;
删除完毕之后,查询information_schema.Routines来确认上面的删除是否成功
SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME='proc' OR ROUTINE_NAME='name_from_t3';
总结
TIPS:
存储过程里面是可以调用其他存储过程的,使用CALL语句调用其他存储过程就可以了
存储过程参数列表里的参数名尽量不要和数据库中表的字段名一样,否则有可能出错
存储过程的参数可以使用中文,在定义存储过程的时候加上character set gbk就可以了