单个SQL语句 实现不了复杂的实际应用,需要一组SQL语句来实现,创建函数,以方便应用。
存储过程
可编程的函数,完成特定功能编写的SQL语句&控制语句的预编译的集合,再次调用时不再编译。
优点:
- 允许标准组件式编程
- 较快的执行速度 (预编译)
- 减少网络流量
- 安全
存储过程的创建
create procedure 存储过程名 ([参数列表[,...]])
过程体;/*参数列表 由 输入输出类型,参数名,参数类型 组成.[in|out|inout] 参数名 类型
*/
e.g.
delimiter $$
create procedure proc_stucent(out cnt int)
beginset 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)) beginif exists( select * from user where uname = username) thenselect '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)) beginif (select count(*) from user where upwd = oldpwd) then select '不是你';else update user set upwd=newpwdwhere uname = username;end if; end $$delimiter ;call register('admin','123456');