前言:對於存儲過程一直有一種抵觸的心理,因為畢業至今所在的公司開發組都不是很規范,對於開發的一些注意事項並沒有很多的規定,只是在知乎上查找相關知識的時候,看到很多人對於在程序里使用存儲過程的不好之處都有很多介紹,碧如邏輯不清晰,調試難等,在項目中也不需要些存儲過程,所以我也沒有認真學習過相關知識,但是最近准備面試,發現還是有很多公司對於存儲過程是有要求的,今天寫點東西記錄一下自己的學習過程,其實也就是對別人的博客進行一個自己的匯總。
什么是存儲過程?
根據百度百科的解釋,存儲過程是在大型關系型數據庫中,一組完成特定功能的Sql語句集,在數據庫中,經過一次編譯之后調用不需要再次編譯,用戶通過指定存儲過程的名稱並給出參數(如果有的話)來執行它。
存儲過程的優點?
1、響應時間上有優勢,普通sql,程序需要驗證語句是否正確,以及編譯優化,如果有很多業務邏輯需要進行處理,可能會多次鏈接數據庫,但是使用存儲過程的話,就只需要一次(預編譯之后會被存儲到高速緩存里),而且運算過程中不需要把數據取出數據庫,數據庫的IO通道效率很差,大量數據取出來很浪費時間;
2、對於系統的穩定性有幫助,程序可能會出BUG導致系統不穩定,而存儲過程則只要數據庫不出現問題,基本上不會出現問題;
3、減少了網絡流量,只需要傳輸存儲過程的名稱和參數即可,從而降低了傳輸量;
4、增強系統安全性,參數化的存儲過程可以防止SQL注入,只授權部分用戶修改存儲過程的權限;
5、可可重復使用,使得服務器端開發和數據庫開發同時進行,加快開發速度;
6、發布程序方便快捷,如果使用常規的sql語句來處理業務邏輯,業務修改,需要重新編譯,然后停止程序進行發布;但是如果業務邏輯寫在存儲過程中,只需要修改存儲過程即可,提高了程序的可移植性。
不過現在有些框架支持把Sql寫到配置文件里面,只需要修改配置文件就可以修改業務。
存儲過程的缺點?
1、移植困難,不同類型的數據庫存儲過程語言差距巨大,基本上無法直接移植;
2、存儲過程本身運算性能很差,而且無法進行封裝,不符合OOP的思想;
3、對於開發和維護的的成本較高。
存過過程的寫法
無參無輸出的存儲過程:
Create procedure 存儲過程名 as SQL語句
帶參無輸出的存儲過程:
Create procedure 存儲過程名 @參數 參數類型 as SQL語句
帶參帶輸出的存儲過程:
Create procedure 存儲過程名 @參數 參數類型 @返回值 返回類型 output as SQL語句
CREATE procedure proc_Test @orderNum int, @flag bit OUTPUT as if exists( select * from SaleOrder where OrderNumber = @orderNum) select @flag=1 else select @flag=0 //執行 DECLARE @re int EXEC proc_Test 10,@re output SELECT @re as '返回值'