MySQL存儲過程-創建智能存儲過程和檢查存儲過程

建立智能存儲過程

迄今為止使用的所有存儲過程基本上都是封裝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;

輸出:

MySQL存儲過程-創建智能存儲過程和檢查存儲過程

輸入:

call?ordertotal(20005,1,@total);  select?@total;

輸出:

MySQL存儲過程-創建智能存儲過程和檢查存儲過程

分析: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’;

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享