MySQL存儲過程

一。爲何要有存儲過程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 來替代。

來自於:http://xdj651897373-126-com.iteye.com/blog/1819924

http://database.51cto.com/art/201006/203159.htm

相關文章
相關標籤/搜索