1、什么是存储过程和函数:
存储过程和函数是事先经过编译并存储在数据库中的一段sql语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。
存储过程和函数的区别在于函数必须有返回值,而存储过程没有,存储过程的参数可以使用IN、OUT、INOUT类型,而函数的参数只能是IN类型的。如果有函数从其他类型的数据库迁移到MySQL,那么就可能因此需要将函数改造成存储过程。
2、存过过程和函数的相关操作:
2.1、创建、修改存储过程或者函数
CREATE PROCEDURE sp_name([pro_parameter[,...]])
[characteristic...] routine_body
CREATE FUNCTION sp_name([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
proc_parameter:
[IN | OUT | INOUT] param_name type
func_paramenter:
param_name type
type:
Any valid MySQL data type
characteristic:
LANGUAGE SQL | [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SERCURITY { DEFINER | INVEOKER }
| COMMENT 'string'
routine_body:
Valid SQL procedure statement or statements
ALTER {PROCEDURE | FUNCTION} sp_name[characteristic...]
characteristic:
{CONTAINS SQL | NO SQL | READS SQL DATA | MODEFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
调用过程的语法如下:
CALL sp_name([parameter[,...]])
MySQL的存储过程和函数中允许包含DDL语句,也允许在存储过程中执行提交(Commit,即确认之前的修改)或者回滚(Rollback,即放弃之前的修改),但是存储过程和函数中不允许执行LOAD DATA INFIL语句。此外,存储过程和函数中可以调用其的过程或者函数。
CREATE DEFINER=`daiyihua`@`%` PROCEDURE `get_sun_count`(IN parentId INT,OUT sunCount INT )
BEGIN
#Routine body goes here...
SELECT COUNT(1) FROM area where parent_id = parentId;
SELECT FOUND_ROWS() INTO sunCount;
END
上面建立的存储过程,表示输入一个parentId,统计符合该条件的记录数并返回;
可以看到调用存储过程于直接执行SQL的效果是相同的,但是存储过程的好处在于处理逻辑都封装在数据库端,调用者不需要了解中间的处理逻辑,一旦处理逻辑发生变化,只需要修改存储过程即可,而对调用者的程序完全没有影响。
另外,和视图的创建语法稍微有点不同,存储过程和函数的CREATE语法不支持使用CREATE OR REPLACE 对存储过程和函数进行修改,如果需要对已有对存储过程或者函数进行修改,需要执行ALTER语法。
2.2、删除存储过程或者函数
一次只能删除一个存储过程或者函数,删除存储过程或者函数需要有该过程或者函数的 ALTER ROUTINE 权限,具体语法如下:
DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name
2.3 、查看存储过程或者函数
2.3.1、查看存储过程或者函数的状态
SHOW {PROCEDURE | FUNCTION } STATUS [ LIKE 'PATTERN' ]
2.3.2、查看存储过程或者函数的定义
SHOW CREATE { PROCEDURE | FUNCTION } sp_name