Oracle developer以其快速的數據處理開發而聞名
如果沒有異常
BEGIN
SELECT
SELECT
SELECT
這種實現的方法缺點在於錯誤處理沒有與正常處理分開
BEGIN
SELECT
SELECT
SELECT
EXCEPTION
WHEN NO_DATA_FOUND THEN
有兩種類型的異常
每當PL/SQL違背了ORACLE原則或超越了系統依賴的原則就會隱式的產生內部異常
exception oracle error sqlcode value condition
no_data_found ora
too_mang_rows ora
dup_val_on_index ora
value_error ora
storage_error ora
zero_divide ora
case_not_found ora
cursor_already_open ora
timeout_on_resource ora
如果要處理未命名的內部異常
在子程序中使用EXCEPTION_INIT的語法如下
PRAGMA EXCEPTION_INIT(exception_name
在該語法中
DECLARE
deadlock_detected EXCEPTION;
PRAGMA EXCEPTION_INIT(deadlock_detected
BEGIN
EXCEPTION
WHEN deadlock_detected THEN
END;
對於用戶自定義異常
reserved_loaned Exception
產生異常後
Exception
When exception
Sequence of statements;
When exception
Sequence of statements;
When others then
由三種方式拋出異常
◆
◆
◆
當數據庫或PL/SQL在運行時發生錯誤時
RAISE exception_name
顯式拋出異常是程序員處理聲明的異常的習慣用法
RAISE TIMEOUT_ON_RESOUCE
比如下面一個訂單輸入的例子
DECLARE
inventory_too_low EXCEPTION;
BEGIN
IF order_rec
RAISE inventory_too_low;
END IF
EXCEPTION
WHEN inventory_too_low THEN
order_rec
END;
RAISE_APPLICATION_ERROR內建函數用於拋出一個異常並給異常賦予一個錯誤號以及錯誤信息
錯誤號的范圍是
如下代碼所示
IF product_not_found THEN
RAISE_APPLICATION_ERROR(
END IF;
PL/SQL程序塊的異常部分包含了程序處理錯誤的代碼
EXCEPTION
WHEN exception_name THEN
Code for handing exception_name
[WHEN another_exception THEN
Code for handing another_exception]
[WHEN others THEN
code for handing any other exception
用戶必須在獨立的WHEN子串中為每個異常設計異常處理代碼
EXCEPTION
WHEN inventory_too_low THEN
order_rec
replenish_inventory(inventory_nbr=>
inventory_rec
WHEN discontinued_item THEN
WHEN zero_divide THEN
WHEN OTHERS THEN
END;
當異常拋出後
BEGIN
DECLARE
bad_credit exception;
BEGIN
RAISE bad_credit;
EXCEPTION
WHEN bad_credit THEN
dbms_output
END;
EXCEPTION
WHEN OTHERS THEN
END;
當異常發生時
BEGIN
DECLARE
bad_credit exception;
BEGIN
RAISE bad_credit;
EXCEPTION
WHEN ZERO_DIVIDE THEN
dbms_output
END
EXCEPTION
WHEN OTHERS THEN
END;
沒有處理的異常將沿檢測異常調用程序傳播到外面
BEGIN
executable statements
BEGIN
today DATE:=
BEGIN
dbms_output
EXCEPTION
WHEN OTHERS THEN
END;
EXCEPTION
WHEN OTHERS THEN
處理異常
END
執行部分拋出的異常將首先傳遞到同一塊的異常部分
在異常部分拋出的異常將控制轉到上一層的異常部分
另外錯誤報告函數SQLCODE和SQLERRM在OTHERS處理器中特別有用
declare
err_num NUMBER;
err_msg VARCHAR
BEGIN
EXCEPTION
WHEN OTHERS THEN
err_num := SQLCODE;
err_msg := SUBSTR(SQLERRM
INSERT INTO errors VALUES (err_num
END;
有關於異常處理的
功能是將某命名異常同某特定Oracle錯誤關聯起來
主用用來捕捉某特定異常錯誤
語法
SQL>
SQL> DECLARE
數字或值錯誤 : 數值精度太高
PL/SQL procedure successfully completed
SQL>
功能用來自定義錯誤消息
語法
error_number
error_message
keep_errors
SQL> BEGIN
ORA
PL/SQL procedure successfully completed
SQL>
A可執行部分發生的異常
當前語句塊有該異常的處理程序
SQL> DECLARE
異常A產生
PL/SQL procedure successfully completed
SQL>
當前語句塊沒有該異常的處理程序
SQL> DECLARE
異常B產生
PL/SQL procedure successfully completed
SQL>
當前語句塊沒有該異常的處理程序
SQL> DECLARE
DECLARE
expa EXCEPTION;
expb EXCEPTION;
BEGIN
BEGIN
RAISE expb;
EXCEPTION
WHEN expa THEN
dbms_output
END;
EXCEPTION
WHEN expa THEN
dbms_output
END;
ORA
ORA
SQL>
B聲明部分發生的異常
聲明部分某賦值發生異常
SQL> BEGIN
異常在外層被處理!
PL/SQL procedure successfully completed
SQL>
C異常部分發生的異常
異常處理器中也會產生異常
例子
SQL>
SQL> BEGIN
外層捕捉到異常B
PL/SQL procedure successfully completed
SQL>
例子
SQL> desc t;
Name Type
ID NUMBER(
SQL> BEGIN
外層捕捉到異常
PL/SQL procedure successfully completed
SQL>
Exception Oracle Error SQLCODE Value
ACCESS_INTO_NULL ORA
CASE_NOT_FOUND ORA
COLLECTION_IS_NULL ORA
CURSOR_ALREADY_OPEN ORA
DUP_VAL_ON_INDEX ORA
INVALID_CURSOR ORA
INVALID_NUMBER ORA
LOGIN_DENIED ORA
NO_DATA_FOUND ORA
NOT_LOGGED_ON ORA
PROGRAM_ERROR ORA
ROWTYPE_MISMATCH ORA
SELF_IS_NULL ORA
STORAGE_ERROR ORA
SUBSCRIPT_BEYOND_COUNT ORA
SUBSCRIPT_OUTSIDE_LIMIT ORA
SYS_INVALID_ROWID ORA
TIMEOUT_ON_RESOURCE ORA
TOO_MANY_ROWS ORA
VALUE_ERROR ORA
ZERO_DIVIDE ORA
Oracle內置函數SQLCODE和SQLERRM是特別用在OTHERS處理器中
OTHERS處理器應該是異常處理塊中的最後的異常處理器
在一個內在的異常中
一個Oracle的錯誤消息最多只能包含
From:http://tw.wingwit.com/Article/program/Oracle/201311/17175.html