单个SQL语句 实现不了复杂的实际应用,需要一组SQL语句来实现,创建函数,以方便应用。
存储过程
可编程的函数,完成特定功能编写的SQL语句&控制语句的预编译的集合,再次调用时不再编译。
优点:
- 允许标准组件式编程
- 较快的执行速度 (预编译)
- 减少网络流量
- 安全
存储过程的创建
create procedure 存储过程名 ([参数列表[,...]])
过程体;
/*参数列表 由 输入输出类型,参数名,参数类型 组成.
[in|out|inout] 参数名 类型
*/
e.g.
delimiter $$
create procedure proc_stucent(out cnt int)
begin
set cnt =(select count(*) from student);
end $$
delimiter ;
call proc_stucnt(@nu);
查看所有的存储过程
select * from information_schema.routines
[where routine_name = '名称'];
修改存储过程
alter procedure sp_name [characteristic ..]
characteristic"
{contains SQL | no SQL | reads SQL data| modifies SQL data}
--alter 只能需改存储过程的特性,不能修改存储过程定义的内容
--e.g.
alter proc1 modifies sql data sql security invoker;
删除存储过程
drop procedure [if exist] 函数名;
函数只能返回一个 返回值or表对象
存储过程 可以返回参数 如,记录集
delimiter $$ create procedure register(username varchar(20), userpwd varchar(20)) begin if exists( select * from user where uname = username) then select 'existed'; else insert into user(uname,upwd) values(username ,userpwd); end if; end $$ delimiter ; call register('admin','123456');
e.g. 注册过程 用户名不能重复
e.g. 修改密码
delimiter $$ create procedure register(name varchar(20), oldupwd varchar(20),newpwd varchar(20)) begin if (select count(*) from user where upwd = oldpwd) then select '不是你'; else update user set upwd=newpwd where uname = username; end if; end $$ delimiter ; call register('admin','123456');