【MySQL必知必會】學習筆記Day12

【MySQL必知必會】學習筆記Day12&3.1&D23章&P163-173頁

21、使用存儲過程

(1)存儲過程
存儲過程簡單來說,就是爲以後的使用而保存 的一條或多條MySQL語句的集合。可將其視爲批文件,雖然它們的作用不僅限於批處理。

(2)爲什麼要使用存儲過程

  • 使用存儲過程有3個主要的好處,即簡單、安全、高性能

  • 通過把處理封裝在容易使用的單元中,簡化複雜的操作(正如前 面例子所述)。

  • 由於不要求反覆建立一系列處理步驟,這保證了數據的完整性。 如果所有開發人員和應用程序都使用同一(試驗和測試)存儲過 程,則所使用的代碼都是相同的。 這一點的延伸就是防止錯誤。需要執行的步驟越多,出錯的可能 性就越大。防止錯誤保證了數據的一致性。

  • 簡化對變動的管理。如果表名、列名或業務邏輯(或別的內容) 有變化,只需要更改存儲過程的代碼。使用它的人員甚至不需要 知道這些變化。

  • 提高性能。因爲使用存儲過程比使用單獨的SQL語句要快。

  • 存在一些只能用在單個請求中的MySQL元素和特性,存儲過程可 以使用它們來編寫功能更強更靈活的代碼

(3)使用存儲過程

① 執行存儲過程

  • eg:執行名爲productpricing的存儲過程,它計算並返回產 品的最低、最高和平均價格。
    存儲過程可以顯示結果,也可以不顯示結果,如稍後所述。
CALL productpricing(@pricelow,
                    @pricehigh,
                    @priceaverage);

② 創建存儲過程

  • eg:返回產品平均價格
CALL PROCEDURE productpricing()
BEGIN
   SELECT Avg(prod_price) AS priceaverage
   FROM products;
END;

BEGIN和END語句用來限定存儲過程體

  • 使用上面的存儲過程
CALL  productpricing()

③ 刪除存儲過程

CALL PROCEDURE productpricing

注:僅當存在時刪除:如果指定的過程不存在,則DROPPROCEDURE將產生一個錯誤。當過程存在想刪除它時(如果過程不存在也 不產生錯誤)可使用DROP PROCEDURE IF EXISTS

④ 使用參數

CREATE PROCEDURE productpricing(
    OUT pl DECIMAL(8,2),
    OUT ph DECIMAL(8,2),
    OUT pa DECIMAL(8,2),
)
BEGIN
    SELECT Min(prod_price)
    INTO pl
    FROM products;
    SELECT Max(prod_price)
    INTO ph
    FROM products;
    SELECT Avg(prod_price)
    INTO pa
    FROM products;
END

此存儲過程接受3個參數:pl存儲產品最低價格,ph存儲產品
最高價格,pa存儲產品平均價格。每個參數必須具有指定的類 型,這裏使用十進制值。關鍵字OUT指出相應的參數用來從存儲過程傳出 一個值(返回給調用者)。MySQL支持IN(傳遞給存儲過程)、OUT(從存 儲過程傳出,如這裏所用)和INOUT(對存儲過程傳入和傳出)類型的參 數。存儲過程的代碼位於BEGIN和END語句內,如前所見,它們是一系列 SELECT語句,用來檢索值,然後保存到相應的變量(通過指定INTO關鍵 字)。

CALL productpricing(@pricelow,
                    @pricehigh,
                    @priceaverage);

由於此存儲過程要求3個參數,因此必須正好傳遞3個參數,不
多也不少。所以,這條CALL語句給出3個參數。它們是存儲過 程將保存結果的3個變量的名字。

注:所有MySQL變量都必須以@開始。

在調用時,這條語句並不顯示任何數據。它返回以後可以顯示(或 在其他處理中使用)的變量。

  • 爲了顯示檢索出的產品平均價格,可如下進行:
SELECT  @priceaverage;
SELECT @pricehigh,@pricelow,@priceaverage;
  • eg:ordertotal接受訂單號並返回該訂單的合計
CREATE PROCEDURE ordertotal(
       IN  onumber INT,
       OUT ototal DECIMAL(8,2),
)
BEGIN
    SELECT Sum(item_price*quantity)
    FROM orderitems
    WHERE order_num = onumber
    INTO ototal;    
END

onumber定義爲IN,因爲訂單號被傳入存儲過程。ototal定義
爲OUT,因爲要從存儲過程返回合計。SELECT語句使用這兩個 參數,WHERE子句使用onumber選擇正確的行,INTO使用ototal存儲計算 出來的合計。

  • 爲調用這個新存儲過程
CALL ordertotal(20005,@total);

必須給ordertotal傳遞兩個參數;第一個參數爲訂單號,第二 個參數爲包含計算出來的合計的變量名。

  • 爲了顯示此合計
SELECT @total;
  • 爲了得到另一個訂單的合計顯示,需要再次調用存儲過程,然後重 新顯示變量:
CALL ordertotal(20009,@total);
SELECT @total;

⑤ 建立智能存儲過程

⑥ 檢查存儲過程
爲顯示用來創建一個存儲過程的CREATE語句,使用 SHOW CREATE PROCEDURE語句:

SHOW CREATE PROCEDURE ordertotal;

SHOW PROCEDURE STATUS列出所有存儲過 程。爲限制其輸出,可使用LIKE指定一個過濾模式,例如:

SHOW  PROCEDURE STATUS LIKE 'ordertotal';

【MySQL必知必會】系列筆記:
【MySQL必知必會1-4章】學習筆記Day1
【MySQL必知必會5-7章】學習筆記Day2
【MySQL必知必會8-9章】學習筆記Day3
【MySQL必知必會10章】學習筆記Day4
【MySQL必知必會11-12章】學習筆記Day5
【MySQL必知必會13章】學習筆記Day6
【MySQL必知必會14-16章】學習筆記Day7
【MySQL必知必會17章】學習筆記Day8
【MySQL必知必會18章】學習筆記Day9
【MySQL必知必會19-20章】學習筆記Day10
【MySQL必知必會21-22章】學習筆記Day11

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