1. 程式人生 > >PL/SQL系統定義的異常操作例項講解

PL/SQL系統定義的異常操作例項講解

程式執行過程中出現錯誤情況被稱為在PL/SQL異常。 PL/SQL支援程式設計師在程式中使用異常塊捕獲這樣的條件並採取適當的動作應對錯誤情況。有兩種型別的異常:系統定義的異常、使用者定義的異常

異常處理語法

一般異常處理的語法如下。在這裡可以列出下來很多,要處理異常。預設的異常將使用WHEN others THEN處理:

DECLARE
   <declarations section>
BEGIN
   <executable command(s)>
EXCEPTION
   <exception handling goes here >
   WHEN exception1 THEN 
       exception1-handling-statements 
   WHEN exception2  THEN 
      exception2-handling-statements 
   WHEN exception3 THEN 
      exception3-handling-statements
   ........
   WHEN others THEN
      exception3-handling-statements
END;

預定義異常

PL/SQL提供許多預先定義的異常,這是在被執行時的任何資料庫規則由程式引發。例如,預定義異常NO_DATA_FOUND時引發一個SELECT INTO語句返回資料行。下表列出了一些重要的預先定義的異常:


操作例項一 除以零的操作原始碼異常:

-- Created on 2018/4/2 by E.WANG 
/*
預設的異常將使用WHEN others THEN處理:

DECLARE
   <declarations section>
BEGIN
   <executable command(s)>
EXCEPTION
   <exception handling goes here >
   WHEN exception1 THEN 
       exception1-handling-statements 
   WHEN exception2  THEN 
      exception2-handling-statements 
   WHEN exception3 THEN 
      exception3-handling-statements
   ........
   WHEN others THEN
      exception3-handling-statements
END;

*/
declare 
  --定義一個簡單的變數
  i integer;
begin
  -- 
  i:=30;
  --當沒有任何選擇,在當選擇一個CASE語句的子句,並且沒有ELSE子句時被引發
  case 
     when i=35 then dbms_output.put_line('It is right!'); 
     --它被引發當一個數試圖除以零。
     when i/0=0 then dbms_output.put_line('Condition is error');
  end case;
  
  --異常獲取程式碼塊
  exception   
     when CASE_NOT_FOUND then 
           dbms_output.put_line('No Case SubState!');
     --它被引發當一個數試圖除以零
     when ZERO_DIVIDE then 
           dbms_output.put_line('Zero is not divided!');      
           
end;

操作例項一執行結果截圖:


操作例項二 引發異常:

-- Created on 2018/4/2 by E.WANG 
/*
異常是資料庫伺服器自動在內部資料庫錯誤,但異常可以明確地提出由程式設計師使用命令RAISE。
以下是引發異常的簡單的語法:

DECLARE
   exception_name EXCEPTION;
BEGIN
   IF condition THEN
      RAISE exception_name;
   END IF;
EXCEPTION
   WHEN exception_name THEN
   statement;
END;
可以在引發Oracle的標準異常或任何使用者定義的異常使用上述語法。
*/
declare 
  --定義一個簡單的變數
  i integer;
begin
  -- 
  i:=30;
  --它被引發當一個數試圖除以零。
  if i/0=0 then
     raise ZERO_DIVIDE;
  end if;
     
  --異常獲取程式碼塊
  exception   
     --它被引發當一個數試圖除以零
     when ZERO_DIVIDE then 
           dbms_output.put_line('Zero is not divided!');      
           
end;

視窗二結果截圖: