MySQL存儲過程

存儲過程

執行存儲過程

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;

分析:刪除存儲過程,只須要給出存儲過程名便可。

使用參數OUT

上面的例子只是簡單地顯示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

使用IN,OUT參數

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。

調用ordertotal

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';
相關文章
相關標籤/搜索