1. 程式人生 > >mysql存儲過程的學習

mysql存儲過程的學習

procedure call 返回 業務邏輯 輸入 總結 執行 輸入參數 調用存儲過程

存儲過程的介紹

存儲過程(Stored Procedure)是在大型數據庫系統中,一組為了完成特定功能的SQL 語句集,存儲在數據庫中,經過第一次編譯後再次調用不需要再次編譯,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。

存儲過程的優點

(1) 減少網絡通信量。存儲過程位於服務器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,調用一個行數不多的存儲過程與直接調用SQL語句的網絡通信量可能不會有很大的差別,可是如果存儲過程包含上百行SQL語句,那麽其性能絕對比一條一條的調用SQL語句要高得多。

  (2) 執行速度更快。存儲過程創建的時候,數據庫已經對其進行了一次編譯。以後在執行存儲過程的時候就不需要在進行編譯,但是一般sql語句沒執行一次就需要編譯一次,所以使用存儲過程可以提高數據庫執行速度。其次,存儲過程一旦執行,在內存中就會保留一份這個存儲過程,這樣下次再執行同樣的存儲過程時,可以從內存中直接中讀取。

  (3) 更強的安全性。存儲過程是通過向用戶授予權限(而不是基於表),它們可以提供對特定數據的訪問,提高代碼安全,比如防止 SQL註入。

  (4) 業務邏輯可以封裝存儲過程中,這樣不僅容易維護,而且執行效率也高

存儲過程的缺點

(1)移植性差,當更換數據庫時,之前編寫的存儲過程就要進行相應的調整。

(2)重新編譯問題,因為後端代碼是運行前編譯的,如果帶有引用關系的對象發生改變時,受影響的存儲過程、包將需要重新編譯(不過也可以設置成運行時刻自動編譯)。 (3) 如果在一個程序系統中大量的使用存儲過程,到程序交付使用的時候隨著用戶需求的增加會導致數據結構的變化,接著就是系統的相關問題了,最後如果用戶想維護該系統可以說是很難很難、而且代價是空前的,維護起來更麻煩。 我提倡不要在存儲過程中進行邏輯處理,存儲過程針對數據庫就只用去進行增刪改查就行,在存儲過程中進行邏輯處理會加大數據庫的工作壓力,我覺得邏輯處理都應該弄到後端去處理。 存儲過程簡單語法
因為mysql的默認語句結束符是分號;為了避免與存儲過程中sql語句結束符沖突所以要先定義分隔符,我們這裏定義//為分隔符,我們使用DELIMITER //這樣的語法,就可以定義結束符了,當然你可以自己定義其他喜歡的符號。 創建存儲過程 delimiter // create procedure 存儲過程名(輸入輸出類型 參數名 參數類型,輸入輸出類型 參數名 參數類型,...) begin sql語句 (存儲過程要完成的操作) end // 實例 1.只帶in(輸入參數)的存儲過程 表示該參數必須在調用存儲過程時被指定,在存儲過程中修改該參數的值不能被被返回,為默認值。
drop PROCEDURE if EXISTS test; 刪除存儲過程 delimiter // 定義分隔符 create PROCEDURE test (in a int) begin select username from xx_admin where id=a; end // set @a=2; 定義變量 call test(@a); 調用存儲過程 技術分享圖片

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 ‘名字‘;

技術分享圖片

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 ‘數量‘;

技術分享圖片

總結in、out區別:
in:表示輸入一個值,你需要一個值,我給你一個值
out:你往外輸出一個值,你輸出的那個值我就拿一個變量來接收你給我輸出的那個值

inout:既能輸入一個值又能傳出來一個值

mysql存儲過程的學習