存儲過程Procedure是一組爲了完成特定功能的SQL語句集合,經編譯後存儲在數據庫中,用戶經過指定存儲過程的名稱並給出參數來執行。 存儲過程當中能夠包含邏輯控制語句和數據操縱語句,它能夠接受參數、輸出參數、返回單個或多個結果集以及返回值。 因爲存儲過程在建立時即在數據庫服務器上進行了編譯並存儲在數據庫中,因此存儲過程運行要比單個的SQL語句塊要快。同時因爲在調用時只需用提供存儲過程名和必要的參數信息,因此在必定程度上也能夠減小網絡流量、簡單網絡負擔。 * 存儲過程的優勢 A、 存儲過程容許標準組件式編程 存儲過程建立後能夠在程序中被屢次調用執行,而沒必要從新編寫該存儲過程的SQL語句。並且數據庫專業人員能夠隨時對存儲過程進行修改,但對應用程序源代碼卻毫無影響,從而極大的提升了程序的可移植性。 B、 存儲過程可以實現較快的執行速度 若是某一操做包含大量的T-SQL語句代碼,分別被屢次執行,那麼存儲過程要比批處理的執行速度快得多。由於存儲過程是預編譯的,在首次運行一個存儲過程時,查詢優化器對其進行分析、優化,並給出最終被存在系統表中的存儲計劃。而批處理的T-SQL語句每次運行都須要預編譯和優化,因此速度就要慢一些。 C、 存儲過程減輕網絡流量 對於同一個針對數據庫對象的操做,若是這一操做所涉及到的T-SQL語句被組織成一存儲過程,那麼當在客戶機上調用該存儲過程時,網絡中傳遞的只是該調用語句,不然將會是多條SQL語句。從而減輕了網絡流量,下降了網絡負載。 D、 存儲過程可被做爲一種安全機制來充分利用 系統管理員能夠對執行的某一個存儲過程進行權限限制,從而可以實現對某些數據訪問的限制,避免非受權用戶對數據的訪問,保證數據的安全。 * mysql存儲過程的用法
-- 查看當前數據庫的存儲過程 show procedure status where Db='wlx'; -- 自定義函數 create procedure pr_add ( a int, b int ) begin declare c int; if a is null then set a = 0; end if; if b is null then set b = 0; end if; set c = a + b; select c as sum; end; -- 調用存儲過程 call pr_add(10, 20); call pr_add(NULL,NULL);
詳細說明以下:mysql
根據存儲過程當中參數的目的,MODE能夠是IN,OUT或INOUT。
param_name是參數的名稱。參數的名稱必須遵循MySQL中列名的命名規則。
在參數名以後是它的數據類型和大小。和變量同樣,參數的數據類型能夠是任何有效的mysql數據類型。
在上面的存儲過程當中,若是存儲過程有多個參數,則每一個參數由逗號(,)分隔。咱們先來看in模式中,使用GetOfficeByCountry存儲過程當中的IN參數來查詢選擇位於特定國家/地區的辦公室的實例:
in
模式sql
USE `wlx`; DROP procedure IF EXISTS `getuserInfo`; DELIMITER $$ USE `wlx`$$ CREATE PROCEDURE getuserInfo(IN usernameparam VARCHAR(255)) BEGIN SELECT * FROM wlx_user WHERE username = usernameparam; END$$ DELIMITER ; <!-- 調用 --> CALL GetOfficeByCountry('USA');
out
模式數據庫
USE `wlx`; DROP procedure IF EXISTS `getUserCount`; DELIMITER $$ CREATE PROCEDURE getUserCount( IN usernameparam VARCHAR(25), OUT total INT) BEGIN SELECT count(id) INTO total FROM wlx_user WHERE username = usernameparam; END$$ DELIMITER ; <!-- 調用須要兩步一塊兒使用 --> CALL getUserCount("string",@total) SELECT @total;
inout
模式編程
DELIMITER $$ CREATE PROCEDURE set_counter(INOUT count INT(4),IN inc INT(4)) BEGIN SET count = count + inc; END$$ DELIMITER ; SET @counter = 1; CALL set_counter(@counter,1); -- 2 CALL set_counter(@counter,1); -- 3 CALL set_counter(@counter,5); -- 8 SELECT @counter; -- 8