本章介紹什麼是儲存過程,為什麼使用、如何使用,並介紹如何建立和使用儲存過程的基本語法
儲存過程
在實際應用中,往往需要執行多個表的多條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顯示一些具體資訊