1.存储过程和函数
存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理效率很有好处。
函数: 必须有返回值,参数只能是IN类型的
存储函数:没有返回值,参数可以使用IN,OUT,INOUT类型
如果有函数从其他类型的数据库迁移到MySQL,那么就可能因此需要将函数改造成存储过程。
2.存储过程和函数的相关操作
- 创建,修改
create procedure sp_name([proc_parameter[,...]])
[characteristic ...] routine_body
create function sp_name([func_parameter[,...]])
returns type
[characteristic ...]routine_body
proc_parameter:
[IN\OUT\INOUT] param_name type
func_parameter:
param_name type
type:
any valid mysql data type
characteristic:
language sql
|[not] deterministic
|{contains sql| not sql |reads sql data|modifies sql data}
|sql security{definer|invoker}
|comment 'string'
routine_body:
valid sql procedure statement or statements
alter {procedure|function} sp_name[characteristic ...]
characteristic:
{contains sql|no sql | reads sql data| modifies sql data}
|sql security {definer|invoker}
|comment 'string'
//调用过程
call sp_name([parameter[,...]])
MySQL的存储过程和函数中允许包含DDL语句,也允许在存储过程中执行提交(Commit,确认之前的修改)或者回滚(Rollback,即放弃之前的修改),但是存储过程和函数中不允许执行load data infile语句,此外,存储过程和函数中可以调用其他的过程或者函数。
//创建一个新过程 delimiter $$ //将结束符改为”$$“ create procedure film_in_stock( IN p_film_id int,IN p_store_id int,out p_film_count int) reads sql data begin select inventory_id from inventory where film_id = p_film_id and store_id = p_store_id and inventory_in_stock(inventory_id); select found_rows() into p_film_count; end $$ Query OK,0 rows affected(0.00sec) delimiter ;//将结束符改回 ”;“