一。爲何要有存儲過程mysql
SQL語句在執行的時候須要先編譯,再執行。而存儲過程(Stored Procedure)是一組爲了完成特定功能的SQL語句集,經編譯後存儲在數據庫中,用戶經過指定存儲過程的名字並給定參數(若是該存儲過程帶有參數)來調用執行它。 存儲過程是數據庫中的一個重要對象,任何一個設計良好的數據庫應用程序都應該用到存儲過程。
一個存儲過程是一個可編程的函數,它在數據庫中建立並保存。它能夠有SQL語句和一些特殊的控制結構組成。當但願在不一樣的應用程序或平臺上執行相同的函數,或者封裝特定功能時,存儲過程是很是有用的。數據庫中的存儲過程能夠看作是對編程中面向對象方法的模擬。它容許控制數據的訪問方式。 sql
存儲過程一般有如下優勢:
(1).存儲過程加強了SQL語言的功能和靈活性。存儲過程能夠用流控制語句編寫,有很強的靈活性,能夠完成複雜的判斷和較複雜的運算。
(2).存儲過程容許標準組件是編程。存儲過程被建立後,能夠在程序中被屢次調用,而沒必要從新編寫該存儲過程的SQL語句。並且數據庫專業人員能夠隨時對存儲過程進行修改,對應用程序源代碼毫無影響。
(3).存儲過程能實現較快的執行速度。若是某一操做包含大量的Transaction-SQL代碼或分別被屢次執行,那麼存儲過程要比批處理的執行速度快不少。由於存儲過程是預編譯的。在首次運行一個存儲過程時查詢,優化器對其進行分析優化,而且給出最終被存儲在系統表中的執行計劃。而批處理的Transaction-SQL語句在每次運行時都要進行編譯和優化,速度相對要慢一些。
(4).存儲過程能過減小網絡流量。針對同一個數據庫對象的操做(如查詢、修改),若是這一操做所涉及的Transaction-SQL語句被組織程存儲過程,那麼當在客戶計算機上調用該存儲過程時,網絡中傳送的只是該調用語句,從而大大增長了網絡流量並下降了網絡負載。
(5).存儲過程可被做爲一種安全機制來充分利用。系統管理員經過執行某一存儲過程的權限進行限制,可以實現對相應的數據的訪問權限的限制,避免了非受權用戶對數據的訪問,保證了數據的安全。 數據庫
1、MySQL 建立存儲過程編程
「pr_add」 是個簡單的 MySQL 存儲過程,這個MySQL 存儲過程有兩個 int 類型的輸入參數 「a」、「b」,返回這兩個參數的和。安全
drop procedure if exists pr_add;
計算兩個數之和網絡
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; /* return c; 不能在 MySQL 存儲過程當中使用。return 只能出如今函數中。 */ end;
2、調用 MySQL 存儲過程函數
call pr_add(10, 20);
執行 MySQL 存儲過程,存儲過程參數爲 MySQL 用戶變量。優化
set @a = 10; set @b = 20; call pr_add(@a, @b);
3、MySQL 存儲過程特色spa
建立 MySQL 存儲過程的簡單語法爲:.net
create procedure 存儲過程名字()([in|out|inout] 參數 datatype) begin MySQL 語句; end;
MySQL 存儲過程參數若是不顯式指定「in」、「out」、「inout」,則默認爲「in」。習慣上,對因而「in」 的參數,咱們都不會顯式指定。
1. MySQL 存儲過程名字後面的「()」是必須的,即便沒有一個參數,也須要「()」
2. MySQL 存儲過程參數,不能在參數名稱前加「@」,如:「@a int」。下面的建立存儲過程語法在 MySQL 中是錯誤的(在 SQL Server 中是正確的)。 MySQL 存儲過程當中的變量,不須要在變量名字前加「@」,雖然 MySQL 客戶端用戶變量要加個「@」。
create procedure pr_add(@a int, -- 錯誤 b int -- 正確 )
3. MySQL 存儲過程的參數不能指定默認值。
4. MySQL 存儲過程不須要在 procedure body 前面加 「as」。而 SQL Server 存儲過程必須加 「as」 關鍵字。
create procedure pr_add(a int, b int) as -- 錯誤,MySQL 不須要 「as」 begin mysql statement ...; end;
5. 若是 MySQL 存儲過程當中包含多條 MySQL 語句,則須要 begin end 關鍵字。
create procedure pr_add(a int,b int) begin mysql statement 1 ...; mysql statement 2 ...; end;
6. MySQL 存儲過程當中的每條語句的末尾,都要加上分號 「;」
... declare c int; if a is null then set a = 0; end if; ... end;
7. MySQL 存儲過程當中的註釋。
/* 這是個多行 MySQL 註釋。*/ declare c int; -- 這是單行 MySQL 註釋 (注意 -- 後至少要有一個空格) if a is null then # 這也是個單行 MySQL 註釋 set a = 0; end if; ... end;
8. 不能在 MySQL 存儲過程當中使用 「return」 關鍵字。
set c = a + b; select c as sum; /* return c; -- 不能在 MySQL 存儲過程當中使用。return 只能出如今函數中。 */ end;
9. 調用 MySQL 存儲過程時候,須要在過程名字後面加「()」,即便沒有一個參數,也須要「()」
call pr_no_param();
10. 由於 MySQL 存儲過程參數沒有默認值,因此在調用 MySQL 存儲過程時候,不能省略參數。能夠用 null 來替代。