MySQL DDL操作--------存儲過程最佳實戰

1. 背景

   * 我們常用的操作數據庫語言SQL語句在執行的時候需要要先編譯,然後執行,而存儲過程(Stored Procedure)是一組爲了完成特定功能的SQL語句集,經編譯後存儲在數據庫中,用戶通過指定存儲過程的名字並給定參數(如果該存儲過程帶有參數)來調用執行它。

  * 一個存儲過程是一個可編程的函數,它在數據庫中創建並保存。它可以有SQL語句和一些特殊的控制結構組成。當希望在不同的應用程序或平臺上執行相同的函數,或者封裝特定功能時,存儲過程是非常有用的。數據庫中的存儲過程可以看做是對編程中面向對象方法的模擬。它允許控制數據的訪問方式。

  * 存儲過程是數據庫存儲的一個重要的功能,但是MySQL 5.0 以前並不支持存儲過程。


2. 存儲過程特點

   * 存儲過程增強了SQL語言的功能和靈活性。存儲過程可以用流控制語句編寫,有很強的靈活性,可以完成複雜的判斷和較複雜的運算。

   * 存儲過程允許標準組件是編程。存儲過程被創建後,可以在程序中被多次調用,而不必重新編寫該存儲過程的SQL語句。而且數據庫專業人員可以隨時對存儲過程進行修改,對應用程序源代碼毫無影響。

   * 存儲過程能實現較快的執行速度。如果某一操作包含大量的Transaction-SQL代碼或分別被多次執行,那麼存儲過程要比批處理的執行速度快很多。因爲存儲過程是預編譯的。在首次運行一個存儲過程時查詢,優化器對其進行分析優化,並且給出最終被存儲在系統表中的執行計劃。而批處理的Transaction-SQL語句在每次運行時都要進行編譯和優化,速度相對要慢一些。

   * 存儲過程能過減少網絡流量。針對同一個數據庫對象的操作(如查詢、修改),如果這一操作所涉及的Transaction-SQL語句被組織程存儲過程,那麼當在客戶計算機上調用該存儲過程時,網絡中傳送的只是該調用語句,從而大大增加了網絡流量並降低了網絡負載。

   * 存儲過程可被作爲一種安全機制來充分利用。系統管理員通過執行某一存儲過程的權限進行限制,能夠實現對相應的數據的訪問權限的限制,避免了非授權用戶對數據的訪問,保證了數據的安全。


3. 存儲過程例子 [ 階乘 ]

   * 創建存儲過程 proc_factorial

     delimiter 設置語句結束符

mysql> delimiter //
mysql> CREATE PROCEDURE proc_factorial
    -> (IN total INT, OUT res INT)
    -> BEGIN
    ->     DECLARE i INT;
    ->     SET i = 1;
    ->     SET res = 1;
    ->     IF total <= 0 THEN
    ->         SET total = 1;
    ->     END IF;
    ->     WHILE i <= total DO
    ->         SET res = res * i;
    ->         SET i = i + 1;
    ->     END WHILE;
    -> END; //
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;


   * 調用存儲過程 proc_factorial, 獲取10的階乘

     call 調用存儲過程

mysql> SET @res = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> call proc_factorial(10, @res);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @res;
+---------+
| @res    |
+---------+
| 3628800 |
+---------+
1 row in set (0.01 sec)


4. 存儲過程總結

  * 存儲過程是存儲在數據庫端的一組SQL語句集。

   * 用戶可以通過存儲過程名和傳參多次調用的程序模塊。

   * 使用靈活,可以使用流控制語句、自定義變量等完成複雜的業務邏輯。

   * 提高數據安全性,屏蔽應用程序直接對錶的操作,易於進行審計。

   * 減少網絡傳輸。

   * 提高代碼維護的複雜度,實際使用中要評估場景是否適合。


5. 總結

以需求驅動技術,技術本身沒有優略之分,只有業務之分。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章