標籤:
在重構機房中經常遇到這樣的問題:很多功能的實現都需要涉及到多張表的操作,比如充值、結賬和退卡等功能的實現。因此,就需要我們多次對資料庫進行操作,代碼量不僅會增加,執行效率也會大大打折扣。於是,預存程序就應運而生,以大大提高執行效率。
1、簡介
預存程序是一組為了完成特定功能的語句集,經過編譯後儲存在資料庫中,使用者通過制定預存程序的名稱並給出參數來執行它。預存程序在運算時產生執行方式並儲存在資料庫當中,當其再次運行時速度比單個的SQL語句要快。
2、優缺點
1)優點
a、複用性強。預存程序可以重複使用,從而減少資料庫開發的工作量。
b、提高執行效率。預存程序在建立的時候就進行了編譯以後每次執行時都不需要重新編譯,執行時比一般SQL語 句更快,提高了效率。
c、減少網路流量。預存程序位於伺服器上,調用的時候只需要傳遞預存程序的名稱以及參數就可以了,因此降低 了網路傳輸的資料量。
d、更加安全。參數化查詢過程可以防止SQL注入攻擊。
2)缺點
雖然預存程序的使用提高了執行效率,但是,若一個程式系統中大量使用預存程序,如果在後期需求變化時導致資料結構發生變化,就會發生問題,而且後期系統維護也會非常困難,代價也是非常大的。
所以,在使用預存程序時一定要謹慎,權衡利弊,儘力使程式達到最優。
3、建立
以重構機房中的充值為例建立一個預存程序,充值商務邏輯為:
1)查詢註冊表,判斷是否登入,如無註冊資訊
2)插入學生資訊
3)插入學生註冊資訊
在SQL Sever中建立預存程序,,右擊選擇建立預存程序。
<span style="font-size:20px;"> -- ============================================= -- Author: <Akali> -- Create date: <2015年05月20日> -- Description: <Register> -- ============================================= CREATE PROCEDURE [dbo].[PROC_Register] --建立預存程序 -- 添加預存程序中的參數 @CardID VARCHAR(15), @StuID VARCHAR(10), @StuName varchar(10), @StuSex varchar(10), @StuDepart varchar(10), @StuGrade varchar(10), @StuClass varchar(10), @StuText varchar(50), @StuCash varchar(10), @StuStatus varchar(10), @RegTime varchar(10), @RegDate varchar(10), @UserID varchar(10), @RegCash varchar(15), @CheckStatus varchar(10) AS BEGIN --添加SQL語句 select * from T_RegInfo where CardID [email protected] if @@ROWCOUNT =0 insert into T_StuInfo (CardID,StuID ,StuName ,StuSex,StuDepart,StuGrade,StuClass,StuText,StuStatus,StuCash ) values (@CardID ,@StuID,@StuName,@StuSex ,@StuDepart ,@StuGrade ,@StuClass,@StuText,@StuStatus,@StuCash ) insert into T_RegInfo (CardID ,StuID ,RegDate ,RegTime ,UserID ,RegCash ,CheckStatus ) values (@CardID ,@StuID ,@RegDate ,@RegTime ,@UserID ,@RegCash ,@CheckStatus ) END </span>
這樣一個預存程序就完成了,當需要使用的時候,我們就可以直接調用D層,以便高效快捷的完成。
4.學習小結在關於本次的學習過程中,總結的還算是比較輕鬆的,其原因在於,先前自己在資料庫方面的總結和對資料庫的一直的學習,而現在對於預存程序的總結倒是很不錯。對於很多資料庫的知識都是很緊密聯絡的,多去總體的學習這幾方面的知識,希望可以得到更多的體會吧!
機房重構之預存程序