避免PL/SQL Case Not Found錯誤三方法

itpremier發表於2010-11-26

避免PL/SQL Case Not Found錯誤三方法
資料庫 2010-02-21 17:34:48 閱讀75 評論0 字號:大中小 訂閱

PL/SQL中提供了豐富的CASE功能。我們可以使用選擇CASE語句來檢測一個表示式的值(更像DECODE函式所完成的功能一樣),並對第一個匹配的值來執行一條或多條語句。使用查詢CASE語句可以檢測多個表示式並根據第一個檢測到為真的表示式執行一條或多條語句。

與其它語言不同,如果沒有任何case相匹配,PL/SQL 中的CASE語句並不是簡單的“泡影”,相反,預設的是丟擲一個ORA-06592異常,“當執行CASE語句時,沒有發現CASE”。

當一次發生時,可能會令你感到驚奇,尤其是如果你已習慣使用其它不會做出同樣反應的語言時。在專案進行了幾個月後,當異常的資料集觸發此類錯誤時,經常會發生此類漏洞。

下面是一個簡單的例子。(該例中使用了查詢CASE語句,但是兩種型別的CASE語句的行為是一樣的)。賦給變數p的初值為0,然後進行測試,因為沒有任何表示式為真,所以發生了ORA-06592異常。
SET SERVEROUT ON
DECLARE
p BINARY_INTEGER:= 0;
q BINARY_INTEGER := 0;
BEGIN
CASE
WHEN p>100 THEN q:= 1;
WHEN p>50 THEN q:= 2;
WHEN p>10 THEN q:= 3;
END CASE;
DBMS_OUTPUT.PUT_LINE('q = ' || q);
END;
/

解決這個問題有三種方法,其中前兩種是很明顯的,第三種則不是很明顯。

第一種明顯的解決方法是確保你的WHEN cases語句包括所有可能的值。這聽起來很簡單,但實際並非如此。例如,如果你有三種情況來包括數值型的域:小於0,等於0和大於0。

這看起來包括了所有可能的值,但是當某個人在表中插入一行該域為空(NULL)的值時,將會怎樣?NULL沒有包含在上述三種情況之中,那麼就會導致Case Not Found的錯誤。

第二種明顯的解決方法是在CASE語句中始終包含ELSE字句。如果沒有一個指定的條件為真,那麼將會執行ELSE子句,這時就不會產生ORA-06592異常。如果你不包含一個ELSE子句,那麼將會產生一個CASE_NOT_FOUND異常使你跳出該語句塊。

第三種不明顯的方法是用一個語句塊將CASE結構包含在其中,並使用該語句塊的EXCEPTION部分進行異常處理。列表B演示了使用該方法的一個例子。

這種方法與使用ELSE子句有一點區別:雖然都可以包含多條語句,但是該方法可以將CASE_NOT_FOUND異常處理放在CASE語句所在語句塊外部的任何地方,並且可以在對應級別捕獲該異常。這意味著當異常發生時,你可以輕鬆處理多個級別的異常。

“防彈”程式碼可以預測可能的錯誤值並對這些值提前做好相應處理準備。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/350519/viewspace-1042144/,如需轉載,請註明出處,否則將追究法律責任。

相關文章