單個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');