1. 程式人生 > >Oracle中RAISE異常

Oracle中RAISE異常

信息 true back 文本 acl 一個 處理 發生 處理異常

由三種方式拋出異常
  
  1. 通過PL/SQL運行時引擎
  
  2. 使用RAISE語句
  
  3. 調用RAISE_APPLICATION_ERROR存儲過程
  
  當數據庫或PL/SQL在運行時發生錯誤時,一個異常被PL/SQL運行時引擎自動拋出。異常也可以通過RAISE語句拋出
  RAISE exception_name;
  
  顯式拋出異常是程序員處理聲明的異常的習慣用法,但RAISE不限於聲明了的異常,它可以拋出任何任何異常。例如,你希望用TIMEOUT_ON_RESOURCE錯誤檢測新的運行時異常處理器,你只需簡單的在程序中使用下面的語句:
  RAISE TIMEOUT_ON_RESOUCE;
  
  比如下面一個訂單輸入的例子,若當訂單小於庫存數量,則拋出異常,並且捕獲該異常,處理異常
  DECLARE
  inventory_too_low EXCEPTION;
  
  ---其他聲明語句
  BEGIN
  IF order_rec.qty>inventory_rec.qty THEN
  RAISE inventory_too_low;
  END IF
  EXCEPTION
  WHEN inventory_too_low THEN
  order_rec.staus:=‘backordered‘;
  END;
  
  RAISE_APPLICATION_ERROR內建函數用於拋出一個異常並給異常賦予一個錯誤號以及錯誤信息。自定義異常的缺省錯誤號是+1,缺省信息是User_Defined_Exception。RAISE_APPLICATION_ERROR函數能夠在pl/sql程序塊的執行部分和異常部分調用,顯式拋出帶特殊錯誤號的命名異常。  Raise_application_error(error_number,message[,true,false]))
  
  錯誤號的範圍是-20,000到-20,999。錯誤信息是文本字符串,最多為2048字節。TRUE和FALSE表示是添加(TRUE)進錯誤堆(ERROR STACK)還是覆蓋(overwrite)錯誤堆(FALSE)。缺省情況下是FALSE。
  
  如下代碼所示:
  IF product_not_found THEN
  RAISE_APPLICATION_ERROR(-20123, ‘Invald product code‘, TRUE);
  END IF;

--------------------------------------------------------------------------------------------------

當異常拋出後,控制無條件轉到異常部分,這就意味著控制不能回到異常發生的位置,當異常被處理和解決後,控制返回到上一層執行部分的下一條語句。
  BEGIN
  DECLARE
  bad_credit exception;
  BEGIN
  RAISE bad_credit;
  --發生異常,控制轉向;
  EXCEPTION
  WHEN bad_credit THEN
  dbms_output.put_line(‘bad_credit‘);
  END;
  --bad_credit異常處理後,控制轉到這裏
  EXCEPTION
  WHEN OTHERS THEN
  
  --控制不會從bad_credit異常轉到這裏
  
  --因為bad_credit已被處理
  
  END;
  
  當異常發生時,在塊的內部沒有該異常處理器時,控制將轉到或傳播到上一層塊的異常處理部分。
  
  BEGIN
  DECLARE ---內部塊開始
  
  bad_credit exception;
  BEGIN
  RAISE bad_credit;
  
  --發生異常,控制轉向;
  EXCEPTION
  WHEN ZERO_DIVIDE THEN --不能處理bad_credite異常
  dbms_output.put_line(‘divide by zero error‘);
  
  END --結束內部塊
  
  --控制不能到達這裏,因為異常沒有解決;
  
  --異常部分
  
  EXCEPTION
  WHEN OTHERS THEN
  --由於bad_credit沒有解決,控制將轉到這裏
  END;

Oracle中RAISE異常