Oracle中RAISE異常詳解

分類:編程 時間:2016-11-05
由三種方式拋出異常

  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;


Tags: message Oracle 處理器 數據庫 程序員

文章來源:


ads
ads

相關文章
ads

相關文章

ad