MySQL 存储过程
MySQL 5添加了對存儲過程的支持
可以單獨編寫每條語句,并根據結果有條件地執行另外的語句。在每次需要這個處理時(以及每個需要它的應用中)都必須做這些工作。可以創建存儲過程。存儲過程簡單來說,就是為以后的使用而保存的一條或多條MySQL語句的集合。可將其視為批文件,雖然它們的作用不僅限于批處理。
為什么要使用存儲過程
下面列出一些主要的理由。
? 通過把處理封裝在容易使用的單元中,簡化復雜的操作(正如前面例子所述)。
? 由于不要求反復建立一系列處理步驟,這保證了數據的完整性。如果所有開發人員和應用程序都使用同一(試驗和測試)存儲過程,則所使用的代碼都是相同的。這一點的延伸就是防止錯誤。需要執行的步驟越多,出錯的可能性就越大。防止錯誤保證了數據的一致性。? 簡化對變動的管理。如果表名、列名或業務邏輯(或別的內容)有變化,只需要更改存儲過程的代碼。使用它的人員甚至不需要知道這些變化。這一點的延伸就是安全性。通過存儲過程限制對基礎數據的訪問減少了數據訛誤(無意識的或別的原因所導致的數據訛誤)的機會。
? 提高性能。因為使用存儲過程比使用單獨的SQL語句要快。? 存在一些只能用在單個請求中的MySQL元素和特性,存儲過程可以使用它們來編寫功能更強更靈活的代碼,換句話說,使用存儲過程有3個主要的好處,即簡單、安全、高性能。顯然,它們都很重要。不過,在將SQL代碼轉換為存儲過程前,也必須知道它的一些缺陷。
? 一般來說,存儲過程的編寫比基本SQL語句復雜,編寫存儲過程需要更高的技能,更豐富的經驗。
? 你可能沒有創建存儲過程的安全訪問權限。許多數據庫管理員限制存儲過程的創建權限,允許用戶使用存儲過程,但不允許他們創建存儲過程。
示例:
CREATE PROCEDURE productpricing()
BEGIN
SELECT AVG(prod_price) AS priceaverage
FROM products;
END;
此存儲過程名為productpricing,用CREATE PROCEDURE productpricing()語句定義。如果存儲過程接受參數,它們將在()中列舉出來。此存儲過程沒有參數,但后跟的()仍然需要。BEGIN和END語句用來限定存儲過程體
CALL productpricing();
因為存儲過程實際上是一種函數,所以存儲過程名后需要有()符號(即使不傳遞參數也需要)。
DROP PROCEDURE IF EXISTS productpricing2;
CREATE PROCEDURE productpricing2(
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;
刪除剛創建的存儲過程。請注意沒有使用后面的(),只給出存儲過程名。
如果指定的過程不存在,則DROP PROCEDURE將產生一個錯誤。當過程存在想刪除它時(如果過程不存在也不產生錯誤)可使用DROP PROCEDURE IF EXISTS。
此存儲過程接受3個參數:pl存儲產品最低價格,ph存儲產品最高價格,pa存儲產品平均價格。每個參數必須具有指定的類型,這里使用十進制值。關鍵字OUT指出相應的參數用來從存儲過程傳出一個值(返回給調用者)。MySQL支持IN(傳遞給存儲過程)、OUT(從存儲過程傳出,如這里所用)和INOUT(對存儲過程傳入和傳出)類型的參數。存儲過程的代碼位于BEGIN和END語句內,如前所見,它們是一系列SELECT語句,用來檢索值,然后保存到相應的變量(通過指定INTO關鍵字)。
CALL productpricing2(@pricelow,@pricehigh,@priceaverage); select @pricelow,@pricehigh,@priceaverage;
為調用此修改過的存儲過程,必須指定3個變量名
所有MySQL變量都必須以@開始。
DROP PROCEDURE IF EXISTS ordertotal;
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;
onumber定義為IN,因為訂單號被傳入存儲過程。ototal定義為OUT,因為要從存儲過程返回合計。SELECT語句使用這兩個參數,WHERE子句使用onumber選擇正確的行,INTO使用ototal存儲計算出來的合計。
存儲過程在CREATE PROCEDURE語句中包含了一個COMMENT值。它不是必需的,但如果給出,將在SHOW PROCEDURE STATUS的結果中顯示。
CALL ordertotal(20005,@total); select @total;
檢查存儲過程
為顯示用來創建一個存儲過程的CREATE語句,使用SHOW CREATE PROCEDURE語句:
SHOW CREATE PROCEDURE ordertotal
為了獲得包括何時、由誰創建等詳細信息的存儲過程列表,使用SHOW PROCEDURE STATUS。
SHOW PROCEDURE STATUS
SHOW PROCEDURE STATUS列出所有存儲過程。為限制其輸出,可使用LIKE指定一個過濾模式,例如:
SHOW PROCEDURE STATUS like 'ordertotal'
書籍:MySQL必知必會-第23章 使用存儲過程
總結
以上是生活随笔為你收集整理的MySQL 存储过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LINPACK測试
- 下一篇: 怎么创建具有真实纹理的CG场景岩石?