[MYSQL -23儲存過程]

VictorLeeLk發表於2017-09-18

儲存過程:為以後的使用而儲存的一條或多條MYSQL語句的集合。可將其視為批檔案,雖然它們的作用不僅限於批處理。

使用儲存過程的理由:


  • 通過處理封裝在容易使用的單元中,簡化複雜的操作。
  • 保證資料的完整性
  • 簡化對變動的管理
  • 提高效能。儲存過程比單獨的SQL語句要快。

總結起來,3個主要好處:簡單、安全、高效能

1、使用儲存過程

MySQL儲存過程的執行稱之為呼叫,因此MySQL執行儲存過程的語句為CALL.
CALL 接收儲存過程的名字以及需要傳遞給它的任意引數。

1.1建立儲存過程

#productpricing為儲存過程名稱。
#DELIMITER //告訴命令列實用程式使用//作為新的語句結束分隔符。
DELIMITER //
CREATE PROCEDURE productpricing()
BEGIN
    SELECT avg(prod_price) as priceaverage
    FROM products;
END //
DELIMITER ;

1.2執行儲存過程。

因為儲存過程實際上是一種函式,所以儲存過程名後需要有()符號。

CALL productpricing()

1.3刪除儲存過程

DROP PROCEDURE productpricing;

1.4使用引數

儲存過程一般不顯示結果,而是把結果返回給你指定的變數。
變數:記憶體中一個特定的位置,用來儲存臨時的資料。所有MYSQL變數都必須以@開始。

DELIMITER //
CREATE PROCEDURE productpricing(
    OUT pl DECIMAL(8,2),
    OUT ph DECIMAL(8,2),
    OUT pa DECIMAL(8,2)
    )
    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 //
DELIMITER ;

此儲存過程接受3個引數:p1儲存產品的最低價,ph儲存產品的最高價,pa儲存產品的平均價。MYSQL支援IN(傳遞給儲存過程)、OUT(從儲存過程傳出,返回給呼叫者)

  • 呼叫儲存過程
CALL productpricing(@pricelow,
                    @pricehigh,
                    @priceaverage
                    );
  • 顯示檢索出的產品平均價。
SELECT @priceaverage;
  • 另一個例項,變數包括IN,OUT。
DELIMITER //
CREATE procedure ordertotal(
    IN onumber INT,
    OUT ototal DECIMAL(8,2)
    )
    BEGIN
    SELECT Sum(item_price*quantity) INTO ototal FROM orderitems WHERE order_num=onumber;
    END //
DELIMITER ;

CALL ordertotal(20005,@total);
SELECT @total;

3、智慧儲存過程

DELIMITER //
CREATE PROCEDURE ordertotal2(
    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 taxrate INDEFUALT 6;
    DECLARE taxrate INT DEFAULT 6;
    SELECT Sum(item_price*quantity) FROM orderitems WHERE order_num = onumber INTO total;
    IF taxable THEN
        SELECT total+(total/100*taxrate) INTO total;
    END IF;
    SELECT total INTO ototal;
    END //
DELIMITER ;
CALL ordertotal2(20005,0,@total);
select @total;

CALL ordertotal2(20005,1,@total);
select @total;

4、檢查儲存過程

SHOW CREATE PROCEDURE ordertotal2;
SHOW PROCEDURE STATUS;

相關文章