mysql-存儲過程

1、什麼是存儲過程

爲以後的使用而保存的一條或多條MySQL語句的集合。
存儲過程思想上就是數據庫 SQL 語言層面的代碼封裝與重用。

2、爲什麼要使用存儲過程

  1. 把處理封裝在容易使用的單元中,簡化複雜的操作
  2. 防止錯誤保證了數據的一致性
  3. 簡化對變動的管理。(修改對應表名、列名等修改對應存儲過程的代碼,對於使用的人不需要知道變化)
  4. 提高性能
  5. 靈活

總的來說是簡單、安全、高性能
缺點:

  1. 編寫比SQL語句複雜
  2. 權限問題(可能無權、一般都是使用存儲過程、沒有創建存儲過程的權限)

3、創建存儲過程

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 //

4、使用存儲過程

存儲過程實際上是一種函數

CALL productpricing();

4、刪除存儲過程

    drop procedure productpricing;
    drop procedure if EXISTS productpricing;

5、使用參數

一般,存儲過程並不顯示結果,而是把結果返回給你指定的變量
變量(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變量都必須以@開始。
調用存儲過程

call productpricing(@pricelow,@pricehign,@priceaverage);

查詢

SELECT @priceaverage;
SELECT @priceaverage,@pricehign,@pricelow;

使用in和out
創建

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;

6、建立智能存儲過程

迄今爲止使用的所有存儲過程基本上都是封裝 MySQL簡單的SELECT語句。雖然它們全都是有效的存儲過程例子,但它們所能完成的工作你直接用這些被封裝的語句就能完成(如果說它們還能帶來更多的東西。那就是使事情更復雜)。只有在存儲過程內包含業務規則和智能處理時,它們的威力才真正顯現出來。

   考慮這個場景。你需要獲得與以前一樣的訂單合計,但需要對合計增加營業稅,不過只針對某些顧客(或許是你所在州中那些顧客)。那麼,你需要做下面幾件事情:
   1、獲得合計(和以前一樣)
   2、把營業稅有條件的添加到合計
   3、返回合計(帶或不帶稅的)

我們輸入如下代碼:

-- 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的其他用法(以及其他流控制語句)。

7、檢查存儲過程

爲顯示用來創建一個存儲過程的CREATE語句

show create PROCEDURE ordertotal;

爲了獲得包括何時、由誰創建等詳細信息的存儲過程列表

show procedure status;

表比較多,用like過濾

show procedure status like 'ordertotal';
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章