標籤:proc 完成 har 應該 lan 系統 簡單文法 影響 速度
預存程序的介紹
預存程序(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預存程序的學習