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