一、基本介绍
存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,减少数据在数据库和应用服务之间的传输,对于提高数据处理的效率是有好处的。
存储过程和函数的区别在于 函数必须有返回值,而存储过程没有,存储过程的参数可以使用IN、OUT、INOUT类型,而函数的参数只能是IN类型的。如果有函数从其他类型的数据库迁移到MySQL,可能需要将函数改造成存储过程。
存储过程和函数允许包含DDL语句,也允许使用事务,还可以调用其他的存储过程和函数,但不允许执行Load Data Infile 语句;
二、相关操作
创建存储过程或函数需要 CREATE ROUTINE 权限,修改或删除存储过程或函数需要 ALTER ROUTINE 权限,执行存储过程或函数需要 EXECUTE 权限。
创建、修改存储过程或函数
Create procedure sp_name([proc_parameter[,…])
[characteristic…] routine_body
Create function sp_name([func_parameter[,…])
Returns type
[characteristic…] routine_body
Return xxx
调用语法:call sp_name([parameter[,…])
参数说明:
pro_parameter
[ IN | OUT | INOUT ] param_name type
func_parameter
param_name type
存储过程和函数中不允许执行 LOAD DATA INFILE 语句。
Delimiter $$ 修改命令结束符
Characteristic特征值:
Language sql 说明下面body是使用sql编写,系统默认
Sql security{ definer | invoker } 可以指定子程序该用创建子程序者的许可来执行还是使用调用者的权限执行。默认是definer
Comment ‘string’ 存储过程或函数的注释信息
{Contains sql | no sql | reads sql data | modifies sql data} 供子程序使用数据的内在信息,目前只提供给服务器,并没有根据这些特征值来约束过程实际使用数据的情况,默认是contains sql;
Contains sql 表示子程序不包含读或写数据的语句。
No sql 表示子程序不包含sql语句。
Reads sql data 表示子程序包含读数据的语句,但不包含写数据的语句。
Modifies sql data 表示子程序包含写数据的语句。
实例: