1. 程式人生 > 實用技巧 >MySQL使用儲存過程

MySQL使用儲存過程

儲存過程簡單來說,就是為了以後的使用而儲存的一條或多條MySQL語句的集合。

為什麼使用儲存過程

  • 通過把處理封裝在容易使用的單元中,簡化複雜的操作
  • 由於不要求反覆建立一系列處理步驟,這保證了資料的完整性。如果所有開發人員和應用程式都使用同一儲存過程,則所使用的程式碼都是相同的。 這一點延伸就是防止錯誤。需要執行的步驟越多,出錯的可能性就越大。防止錯誤保證了資料的一致性。
  • 簡化對變動的管理。如果表名、列名或業務邏輯有變化,只需要更改儲存過程的程式碼。使用它的人員甚至不需要這些變化。 這一點的延伸就是安全性。通過儲存過程限制對基礎資料的訪問,減少了資料訛誤的機會。
  • 提高效能。因為使用儲存過程比使用單獨的SQL語句要快。
  • 存在一些只能用在單個請求中的MySQL元素和特性,儲存過程可以使用他們來編寫功能更強更靈活的程式碼。

使用儲存過程

建立儲存過程

使用 CREATE PROCEDURE定義儲存過程。如果儲存過程接受引數,它們將在儲存過程名稱括號中列舉出來。BEGINEND語句來限定儲存過程體。

//預設的MySQL命令列分隔符是; "DELIMITER  //"告訴命令列實用程式使用"//"作為新的語法結束分隔符。
DELIMITER //
CREATE PROCEDURE productpricing()
BEGIN
	SELECT Avg(prod_price) AS priceaverage
    FROM products;
END //

使用

CALL productpricing();

刪除儲存過程

DROP PROCEDURE productpricing;

使用引數

變數:記憶體中一個特定的位置,用來臨時儲存資料,都必須以@開始。

引數的資料型別: 儲存過程的引數允許的資料型別與表中使用的資料型別相同。記錄集是不允許的型別,因此,不能通過一個引數返回多個行和列。

OUT指出相應的引數用來從儲存過程傳出一個值(返回給呼叫者),IN (傳遞給儲存過程),INOUT(對儲存過程傳入傳出)

通過關鍵字INTO將查詢結果儲存到相應的變數。

//定義帶引數的儲存過程
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 //    

//呼叫帶引數的儲存過程 
CALL productpricing(@pricelow,
					@pricehigh,
                    @priceaverage
);   

//顯示呼叫結果
SELECT @pricelow,@pricehigh;
DELIMITER //
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(20009,@total);
SELECT @total;

檢查儲存過程

SHOW PROCEDURE STATUS;檢視所有的儲存過程,可使用LIKE限制

SHOW PROCEDURE STATUS LIKE 'ordertotal';
//檢視建立此儲存過程的語句
SHOW CREATE PROCEDURE ordertotal;

結果: