CALL productprice(@pricelow,@pricehigh,@priceaverage)
分析:執行名爲productprice的存儲過程,它計算並返回產品的最低,最高和平均價格sql
DELIMITER // CREATE PROCEDURE productpricing () BEGIN SELECT AVG(prod_price) AS priceaverage FROM t_product ; END// DELIMITER ;
分析:用CREATE PROCEDURE productpricing()語句定義存儲過程。若是存儲過程接受參數,參數在()中列舉。即便存儲過程不須要參數,()也是必須的。函數
默認的MySQL語句的分隔符是;MySQL命令行程序也使用;做爲語句分隔符。若是使用命令行工具解釋存儲過程內的;字符,會出現SQL語法錯誤的提示。解決辦法是:工具
DELIMITER //spa
.......net
存儲過程定義命令行
......code
DELIMITER ;ci
DELIMITER //告訴命令行程序,使用//做爲新的語句結束分隔符。因此,上面建立存儲過程的語句結束時END//。get
使用DELIMITER ;恢復命令行的語句分隔符。產品
CALL productpricing();
分析:存儲過程其實是一種函數,因此存儲過程調用時,名稱後要有(),即便不傳遞參數也要有。
DROP PROCEDURE productpricing;
分析:刪除存儲過程,只須要給出存儲過程名便可。
上面的例子只是簡單地顯示SELECT語句的結果。
通常狀況下,存儲過程並不顯示結果,而是把結果返回給你指定的變量。
如下是productpricing的修改版:
DELIMITER // CREATE PROCEDURE productpricing_2 ( OUT pl DECIMAL (8, 2), OUT ph DECIMAL (8, 2), OUT pa DECIMAL (8, 2) ) BEGIN SELECT MIN(prod_price) INTO pl FROM t_product ; SELECT MAX(prod_price) INTO ph FROM t_product ; SELECT AVG(prod_price) INTO pa FROM t_product ; END// DELIMITER ;
分析:此存儲過程接受3個參數:
pl存儲產品最低價,ph存儲產品最高價,pa存儲產品平均價。
每一個參數都要有指定的類型。
關鍵字OUT修飾的參數,是存儲過程傳出的一個值(給調用者)。
MySQL支持IN,OUT,INOUT三種類型的參數。
CALL productpricing_2(@pricelow,@pricehigh,@priceaverage);
注意:全部的MySQL變量都必須以@開始
調用時,這條語句並不顯示任何數據,調用上述存儲過程只是返回了3個供之後顯示(或者在其餘處理中使用)的變量。
SELECT @pricehigh,@pricelow,@priceaverage
delimiter // CREATE PROCEDURE ordertotal ( IN orderId INT, OUT totalMoney DECIMAL (8, 2) ) BEGIN SELECT SUM(price * quantity) FROM order_items WHERE order_id = orderId INTO totalMoney ; END// delimiter ;
分析:ordertotal存儲過程接受訂單號參數orderId,並返回該訂單的總價格totalMoney。
CALL ordertotal(1,@total)
SELECT @total
存儲過程內包含業務規則和智能處理是,它們的威力才真正顯示出來。
需求:得到和之前同樣的訂單總價格,可是須要對總價格增長營業稅,不過只對某些顧客,那麼,須要作3件事:
1,得到總價格
2,把營業稅有條件地添加到總價格上
3,返回總價格(帶或者不帶稅)
-- Name: ordertotal_2 -- Parameters:orderId = order id -- taxable = 0 if not taxable,1 if taxable -- totalmoney = order total variable DELIMITER // CREATE PROCEDURE ordertotal_2 ( IN orderId INT, IN taxable BOOLEAN, OUT totalmoney DECIMAL (8, 2) ) COMMENT 'obtain order total,optionally adding tax' BEGIN DECLARE total DECIMAL (8, 2) ; -- 聲明變量total DECLARE taxrate INT DEFAULT 6 ;-- 聲明稅率taxrate -- 計算total SELECT SUM(price * quantity) FROM order_items WHERE order_id = orderId INTO total ; -- 判斷是否收稅 IF taxable THEN -- 收稅,對總錢數加上稅率進行計算 SELECT total + (total / 100 * taxrate) INTO total ; END IF ; -- 將結果輸出到totalmoney SELECT total INTO totalmoney ; END // DELIMITER ;
DECLARE語句定義了兩個局部變量。
DECLARE要求指定變量名和數據類型
-- 不交稅 CALL ordertotal_2(1,0,@total) -- 交稅 CALL ordertotal_2(1,1,@total)
SELECT @total
檢查存儲過程
爲了顯示一個存儲過程的create語句,使用show create procedure 語句。
SHOW CREATE PROCEDURE ordertotal; -- 顯示更多信息 SHOW PROCEDURE STATUS LIKE ‘ordertotal';