爲之後的使用而保存的一條或多條MySQL語句的集合。
存儲過程思想上就是數據庫 SQL 語言層面的代碼封裝與重用。mysql
總的來講是簡單、安全、高性能
缺點:sql
CREATE PROCEDURE productpricing() BEGIN SELECT Avg(prod_price) AS priceaverage FROM products; END
注意:在命令行中輸入的問題數據庫
mysql> delimiter // mysql> CREATE PROCEDURE productpricing() -> BEGIN -> SELECT Avg(prod_price) AS priceaverage -> FROM products; -> END //
存儲過程其實是一種函數安全
CALL productpricing();
drop procedure productpricing; drop procedure if EXISTS productpricing;
通常,存儲過程並不顯示結果,而是把結果返回給你指定的變量
變量(variable)內存中一個特定的位置,用來臨時存儲數據。函數
CREATE PROCEDURE productpricing( OUT p1 DECIMAL(8,2), OUT ph DECIMAL(8,2), OUT pa DECIMAL(8,2) ) BEGIN SELECT MIN(prod_price) INTO p1 FROM products; SELECT MAX(prod_price) INTO ph FROM products; SELECT avg(prod_price) INTO pa FROM products; END;
關鍵字OUT指出相應的參數用來從存儲過程傳出 一個值(返回給調用者)。
MySQL支持IN(傳遞給存儲過程)、
OUT(從存 儲過程傳出,如這裏所用)
INOUT(對存儲過程傳入和傳出)類型的參 數。性能
變量名 全部MySQL變量都必須以@開始。
調用存儲過程this
call productpricing(@pricelow,@pricehign,@priceaverage);
查詢命令行
SELECT @priceaverage;
SELECT @priceaverage,@pricehign,@pricelow;
使用in和out
建立code
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;
調用內存
call ordertotal(20005,@total);
查詢
select @total;
迄今爲止使用的全部存儲過程基本上都是封裝 MySQL簡單的SELECT語句。雖然它們全都是有效的存儲過程例子,但它們所能完成的工做你直接用這些被封裝的語句就能完成(若是說它們還能帶來更多的東西。那就是使事情更復雜)。只有在存儲過程內包含業務規則和智能處理時,它們的威力才真正顯現出來。
考慮這個場景。你須要得到與之前同樣的訂單合計,但須要對合計增長營業稅,不過只針對某些顧客(或許是你所在州中那些顧客)。那麼,你須要作下面幾件事情: 一、得到合計(和之前同樣) 二、把營業稅有條件的添加到合計 三、返回合計(帶或不帶稅的)
咱們輸入以下代碼:
-- Name: ordertotal // 添加註釋 -- Parameters: onumber = order number -- taxable = 0 if not taxable, 1 if taxtable -- 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;
此存儲過程有很大的變更。首先,增長了註釋(前面放置 --)。在存儲過程複雜性增長時,這樣作特別重要。 添加了另一個參數 taxable,它是一個布爾值(若是要增長稅則爲真,不然爲假)。 在存儲過程體中,用 DECLARE語句定義了兩個局部變量。 DECLARE要求指定變量名和數據類型, 它也支持可選的默認值(這個例子中的 taxrate的默認被設置爲 6%)。SELECT 語句變,所以其結果存儲到 total(局部變量)而不是 ototal。 IF 語句檢查taxable是否爲真,若是爲真,則用另外一SELECT語句增長營業稅到局部變量 total。 最後,用另外一SELECT語句將total(它增長或許不增長營業稅)保存到 ototal。 注意:COMMENT關鍵字 ,本例子中的存儲過程在 CREATE PROCEDURE語句中包含了一個 COMMENT值。 它不是必需的,但若是給出,將在SHOW PROCEDURE STATUS的結果中顯示。 這顯然是一個更高級,功能更強的存儲過程。爲試驗它,請用如下兩條語句: 第一條:
call ordertotal(20005, 0, @total); SELECT @total;
輸出:
+--------+ | @total | +--------+ | 38.47 | +--------+
第二條:
call ordertotal(20009, 1,@total); SELECT @total;
輸出:
+--------+ | @total | +--------+ | 36.21 | +--------+
BOOLEAN值指定爲1 表示真,指定爲 0表示假(實際上,非零值都考慮爲真,只有 0被視爲假)。經過給中間的參數指定 0或1 ,能夠有條件地將營業稅加到訂單合計上。
這個例子給出了 MySQL的IF 語句的基本用法。 IF語句還支持 ELSEIF和ELSE 子句(前者還使用 THEN子句,後者不使用)。在之後章節中咱們將會看到 IF的其餘用法(以及其餘流控制語句)。
爲顯示用來建立一個存儲過程的CREATE語句
show create PROCEDURE ordertotal;
爲了得到包括什麼時候、由誰建立等詳細信息的存儲過程列表
show procedure status;
表比較多,用like過濾
show procedure status like 'ordertotal';