mysql存儲過程的學習
存儲過程的介紹
存儲過程(Stored Procedure)是在大型數據庫系統中,一組為了完成特定功能的SQL 語句集,存儲在數據庫中,經過第一次編譯後再次調用不需要再次編譯,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。
存儲過程的優點
(1) 減少網絡通信量。存儲過程位於服務器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,調用一個行數不多的存儲過程與直接調用SQL語句的網絡通信量可能不會有很大的差別,可是如果存儲過程包含上百行SQL語句,那麽其性能絕對比一條一條的調用SQL語句要高得多。
(2) 執行速度更快。存儲過程創建的時候,數據庫已經對其進行了一次編譯。以後在執行存儲過程的時候就不需要在進行編譯,但是一般sql語句沒執行一次就需要編譯一次,所以使用存儲過程可以提高數據庫執行速度。其次,存儲過程一旦執行,在內存中就會保留一份這個存儲過程,這樣下次再執行同樣的存儲過程時,可以從內存中直接中讀取。
(3) 更強的安全性。存儲過程是通過向用戶授予權限(而不是基於表),它們可以提供對特定數據的訪問,提高代碼安全,比如防止 SQL註入。
(4) 業務邏輯可以封裝存儲過程中,這樣不僅容易維護,而且執行效率也高
存儲過程的缺點
(1)移植性差,當更換數據庫時,之前編寫的存儲過程就要進行相應的調整。
(2)重新編譯問題,因為後端代碼是運行前編譯的,如果帶有引用關系的對象發生改變時,受影響的存儲過程、包將需要重新編譯(不過也可以設置成運行時刻自動編譯)。 (3) 如果在一個程序系統中大量的使用存儲過程,到程序交付使用的時候隨著用戶需求的增加會導致數據結構的變化,接著就是系統的相關問題了,最後如果用戶想維護該系統可以說是很難很難、而且代價是空前的,維護起來更麻煩。 我提倡不要在存儲過程中進行邏輯處理,存儲過程針對數據庫就只用去進行增刪改查就行,在存儲過程中進行邏輯處理會加大數據庫的工作壓力,我覺得邏輯處理都應該弄到後端去處理。 存儲過程簡單語法![技術分享圖片](http://image.bubuko.com/info/201803/20180308150140383848.png)
2.只帶out(輸出參數)的存儲過程;
該值可在存儲過程內部被改變,並可返回。
drop PROCEDURE if EXISTS test;
delimiter //
create PROCEDURE test (OUT a varchar(20))
begin
select username into a from xx_admin where id=2;
end //
delimiter ;
call test(@a);
select @a as ‘名字‘;
![技術分享圖片](http://image.bubuko.com/info/201803/20180308150140444398.png)
3.只帶inout(出入輸出參數)的存儲過程;
drop PROCEDURE if EXISTS test;
delimiter //
create PROCEDURE test (inout a int)
begin
select count(*) into a from xx_admin where id=a;
end //
delimiter ;
set @a=2;
call test(@a);
select @a as ‘數量‘;
![技術分享圖片](http://image.bubuko.com/info/201803/20180308150140544987.png)
總結in、out區別:
in:表示輸入一個值,你需要一個值,我給你一個值
out:你往外輸出一個值,你輸出的那個值我就拿一個變量來接收你給我輸出的那個值
inout:既能輸入一個值又能傳出來一個值
mysql存儲過程的學習