建立智能存儲過程
迄今為止使用的所有存儲過程基本上都是封裝MySQL簡單的 SELECT語句。雖然它們全都是有效的存儲過程例子,但它們所能完成的工作你直接用這些被封裝的語句就能完成(如果說它們還能帶來更多的東西,那就是使事情更復雜)。只有在存儲過程內包含業務規則和智能處理時,它們的威力才真正顯現出來。
考慮這個場景。你需要獲得與以前一樣的訂單合計,但需要對合計增加營業稅,不過只針對某些顧客(或許是你所在州中那些顧客)。那么,你需要做下面幾件事情:
1.獲得合計(與以前一樣);
2.把營業稅有條件地添加到合計;
3.返回合計(帶或不帶稅)。
存儲過程的完整工作如下:
輸入:
--?Name:ordertotal --?Parmeters:onumber?=?order?number --???????????taxable?=?0?if?not?taxable --???????????ototal?=?order?total?variable create?procedure?ordretotal( in?onumber?int, in?taxable?boolean, out?ototal?decimal(8,2) )comment?'obtain?order?total,optiomally?adding?tax' begin --?dexlare?variable?for?total declare?total?decimal(8,2); --?delcare?tax?percentage declare?taxtate?int?default?6; --?get?the?ordertotal 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;
輸出:
輸入:
call?ordertotal(20005,1,@total); select?@total;
輸出:
分析:BOOLEAN 值指定為 1 表示真,指定為 0 表示假(實際上,非零值都考慮為真,只有 0 被視為假)。通過給中間的參數指定 0 或 1 ,可以有條件地將營業稅加到訂單合計上。
IF 語句 這個例子給出了MySQL的 IF 語句的基本用法。 IF 語句還支持 ELSEIF 和 ELSE 子句(前者還使用 THEN 子句,后者不使用)。在以后章節中我們將會看到 IF 的其他用法(以及其他流控制語句)。
檢查存儲過程
為顯示用來創建一個存儲過程的 CREATE 語句,使用 SHOW CREATE
PROCEDURE 語句:
輸入:
show?create?procedure?ordetotal;
為了獲得包括何時、由誰創建等詳細信息的存儲過程列表,使用 SHOW PROCEDURE STATUS 。
限制過程狀態結果 SHOW PROCEDURE STATUS 列出所有存儲過程。為限制其輸出,可使用 LIKE 指定一個過濾模式,例如:
show procedure status like ‘ordertotal’;