11、存儲過程

1. 爲何須要使用存儲過程。

存儲過程能夠理解成函數,調用存儲過程就是調用函數。 因此使用存儲過程的理由有下:mysql

  • 封裝性。 經過把處理封裝在容易使用的單元中,簡化複雜的操做。
  • 完整性。 因爲不要求反覆創建一系列處理步驟,這保證了數據的完整性。
  • 防止錯誤。 須要執行的步驟越多,出錯的可能
    性就越大。防止錯誤保證了數據的一致性。
  • 簡化對變更的管理。 若是表名、列名或業務邏輯(或別的內容)有變化,只須要更改存儲過程的代碼。使用它的人員甚至不須要知道這些變化。

實際上就是函數的做用。sql

可是語句複雜,且咱們須要有建立存儲過程的安全訪問權限才能夠。安全

2. 建立存儲過程。

先看:函數

CREATE PROCEDURE productpricing()
BEGIN
    SELECT Avg(prod_price) AS priceaverage
    FROM products;
END;

這就是建立一個存儲過程。首先,咱們使用關鍵詞code

CREATE PROCEDURE 函數名()

括號裏面能夠有參數,如今先寫一個沒有的。隨後再BEGIN和END中間寫下咱們的執行體(函數體)。ci

這裏要注意:分號結尾問題。咱們在函數體裏用分號結尾,整條命令就結束了,沒法跳到END。因此咱們在建立存儲過程以前要先改變結尾的命令符。it

delimiter //

使用delimiter關鍵字來改變,上句是改爲雙斜杆。建立完存儲過程以後,咱們要使用select

delimiter ;

來改回分號作結束符。權限

3. 執行存儲過程。

CALL productpricing();

4. 刪除存儲過程。

DROP PROCEDURE productpricing;

5. 使用參數。

(1) 建立。
mysql> CREATE PROCEDURE productpricing(
-> OUT pl DECIMAL(8,3),
-> OUT ph DECIMAL(8,3),
-> OUT pa DECIMAL(8,3)
-> )
-> 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;
-> //

關鍵字解釋:im

  • OUT: 參數中的out是表示傳出參數。對應還有IN是傳入參數,INOUT是傳入傳出參數。
  • DECIMAL(8,3): 返回一個總數最多8位,小數佔3位。
  • INTO : 可看作賦值。
(2) 使用。
CALL productpricing(@pricelow,@pricehigh,@priceavg);

如今三個數都傳上來了,執行:

select @pricelow;

皆能夠獲得第一個參數值:

+-----------+
| @pricelow |
+-----------+
|     2.500 |
+-----------+
1 row in set (0.00 sec)

同理可得其它兩個參數。

如今舉個有IN關鍵字的例子:

mysql> CREATE PROCEDURE ordertotal(
-> IN onumber INT,
-> OUT total DECIMAL(8,2)
-> )
-> BEGIN
->     SELECT Sum(item_price*quantity)
->     FROM orderitems
->     WHERE order_num = onumber
->     INTO total;
-> END;
-> //

執行:

CALL ordertotal(20005,@total);

再檢索結果:

mysql> select @total;
+--------+
| @total |
+--------+
| 149.87 |
+--------+
1 row in set (0.00 sec)

6. 檢查存儲過程。

查看咱們建立的存儲過程的信息:

SHOW CREATE PROCEDURE 名字;

若是是想要得到什麼時候、誰等詳細信息,使用:

SHOW PROCEDURE STATUS;
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息