存儲過程能夠理解成函數,調用存儲過程就是調用函數。 因此使用存儲過程的理由有下:mysql
實際上就是函數的做用。sql
可是語句複雜,且咱們須要有建立存儲過程的安全訪問權限才能夠。安全
先看:函數
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 ;
來改回分號作結束符。權限
CALL productpricing();
DROP PROCEDURE productpricing;
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
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)
查看咱們建立的存儲過程的信息:
SHOW CREATE PROCEDURE 名字;
若是是想要得到什麼時候、誰等詳細信息,使用:
SHOW PROCEDURE STATUS;