存儲過程簡介
SQL語句需要先編譯然后執(zhí)行,而存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集可训,經(jīng)編譯后存儲在數(shù)據(jù)庫中,用戶通過指定存儲過程的名字并給定參數(shù)(如果該存儲過程帶有參數(shù))來調(diào)用執(zhí)行它零院。
存儲過程是可編程的函數(shù)迫筑,在數(shù)據(jù)庫中創(chuàng)建并保存,可以由SQL語句和控制結(jié)構(gòu)組成巩趁。當(dāng)想要在不同的應(yīng)用程序或平臺上執(zhí)行相同的函數(shù)痒玩,或者封裝特定功能時,存儲過程是非常有用的议慰。數(shù)據(jù)庫中的存儲過程可以看做是對編程中面向?qū)ο蠓椒ǖ哪M蠢古,它允許控制數(shù)據(jù)的訪問方式。
存儲過程的優(yōu)點:
(1).增強SQL語言的功能和靈活性:存儲過程可以用控制語句編寫别凹,有很強的靈活性草讶,可以完成復(fù)雜的判斷和較復(fù)雜的運算。
(2).標(biāo)準(zhǔn)組件式編程:存儲過程被創(chuàng)建后番川,可以在程序中被多次調(diào)用到涂,而不必重新編寫該存儲過程的SQL語句。而且數(shù)據(jù)庫專業(yè)人員可以隨時對存儲過程進行修改颁督,對應(yīng)用程序源代碼毫無影響。
(3).較快的執(zhí)行速度:如果某一操作包含大量的Transaction-SQL代碼或分別被多次執(zhí)行浇雹,那么存儲過程要比批處理的執(zhí)行速度快很多沉御。因為存儲過程是預(yù)編譯的。在首次運行一個存儲過程時查詢昭灵,優(yōu)化器對其進行分析優(yōu)化吠裆,并且給出最終被存儲在系統(tǒng)表中的執(zhí)行計劃。而批處理的Transaction-SQL語句在每次運行時都要進行編譯和優(yōu)化烂完,速度相對要慢一些试疙。
(4).減少網(wǎng)絡(luò)流量:針對同一個數(shù)據(jù)庫對象的操作(如查詢、修改)抠蚣,如果這一操作所涉及的Transaction-SQL語句被組織進存儲過程祝旷,那么當(dāng)在客戶計算機上調(diào)用該存儲過程時,網(wǎng)絡(luò)中傳送的只是該調(diào)用語句嘶窄,從而大大減少網(wǎng)絡(luò)流量并降低了網(wǎng)絡(luò)負載怀跛。
(5).作為一種安全機制來充分利用:通過對執(zhí)行某一存儲過程的權(quán)限進行限制,能夠?qū)崿F(xiàn)對相應(yīng)的數(shù)據(jù)的訪問權(quán)限的限制柄冲,避免了非授權(quán)用戶對數(shù)據(jù)的訪問吻谋,保證了數(shù)據(jù)的安全。
MySQL的存儲過程
存儲過程是數(shù)據(jù)庫的一個重要的功能现横,MySQL 5.0以前并不支持存儲過程漓拾,這使得MySQL在應(yīng)用上大打折扣阁最。好在MySQL 5.0開始支持存儲過程,這樣即可以大大提高數(shù)據(jù)庫的處理速度骇两,同時也可以提高數(shù)據(jù)庫編程的靈活性速种。
1、相當(dāng)于java當(dāng)中的void的方法
CREATE? PROCEDURE? ? 過程名 ([過程參數(shù)[,...]])?[特性 ...] 過程體
2脯颜、新建存儲過程示例
CREATE? procedure p_emp_query()
begin
??????? update emp set emp_sal = emp_sal + 1;
?????? select emp_no, emp_no, emp_name from emp;
end;
3哟旗、調(diào)用存儲過程
call p_emp();
移除存儲過程
drop procedure p_emp;