《MySQL必知必會》之快速入門儲存過程

2022-12-11 06:00:40

使用儲存過程

本章介紹什麼是儲存過程,為什麼使用、如何使用,並介紹如何建立和使用儲存過程的基本語法

儲存過程

在實際應用中,往往需要執行多個表的多條sql語句

儲存過程就是為以後的使用而儲存的一條或者多條sql語句的集合

使用儲存過程的好處:簡單、安全、高效能

建立儲存過程

需求:一個返回產品平均價格的儲存過程

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

此儲存過程名為productpricing,用CREATE PROCEDURE productpricing()語句定義,如果有引數需要在()中列舉

BEGIN...END用來限定儲存過程體,過程體本身就是一個簡單的select語句

注意:

; 分號衝突的問題,MySQL命令列實用程式也使用 ; 作為分隔符

解決辦法是臨時更改命令列實用程式的語句分隔符

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

DELIMITER //就是指定命令列實用程式實用//作為新的語句結束分隔符

CALL productpricing();
DROP PEOCEDURE productpricing;

通過上述程式碼呼叫和刪除儲存過程

使用引數

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(對儲存過程傳入和傳出)型別的引數

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

上述儲存過程中的三個形參對應了此時呼叫儲存過程中的三個實參

注意MySQL中的變數都是以@開始的

於是就可以使用變數了

SELECT @priceaverage;

需求:使用儲存過程設計一個接收訂單號並返回該訂單的合計

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表示要從儲存過程返回合計,INTO將select後的值存入ototal

CALL ordertotal(20005,@total);
SELECT @total;

上述sql即可返回訂單合計

建立智慧儲存過程

想要完成更復雜的業務,需求:需要對合計新增營業稅

-- Name: ordertotal
-- Parameters: onumber = order number
--             taxable = 0 if not taxable, 1 if taxable
--             ototal = order total variable

CREATE PROCEDURE ordertotal(
   IN onumber INT,
   IN taxable BOOLEAN,
   OUT ototal DECIMAL(8,2)
) COMMENT 'Obtain order total, optionally adding tax'
BEGIN

   -- Declare variable for total
   DECLARE total DECIMAL(8,2);
   -- Declare tax percentage
   DECLARE taxrate INT DEFAULT 6;

   -- Get the order total
   SELECT Sum(item_price*quantity)
   FROM orderitems
   WHERE order_num = onumber
   INTO total;

   -- Is this taxable?
   IF taxable THEN
      -- Yes, so add taxrate to the total
   SELECT total+(total/100*taxrate) INTO total;
   END IF;

   -- And finally, save to out variable
   SELECT total INTO ototal;

END;

上述sql在之前基礎上增加了taxable的布林型別,使用DECLARE定義了兩個區域性變數,通過IF子句檢查taxable是否為真從而增加稅收

CALL ordertotal(20005,0,@total);
SELECT @total;

指定0或者1來決定是否增添稅收

檢查儲存過程

SHOW CREATE PROCEDURE ordertotal;

上述sql顯示ordertotal的儲存過程的create語句

SHOW PROCEDURE STATUS ordertotal;

上述sql顯示一些具體資訊