pl sql異常處理

2021-07-07 10:26:05 字數 2744 閱讀 7983

丟擲異常

oracle有三種型別的異常錯誤:

1. 預定義(predefined)異常

oracle預定義的異常情況大約有24個。對這種異常情況的處理,無需在程式中定義,由oracle自動將其引發。

2. 非預定義(predefined)異常

即其他標準的oracle錯誤。對這種異常情況的處理,需要使用者在程式中定義,然後由oracle自動將其引發。

3. 使用者定義(user_define)異常

程式執行過程中,出現程式設計人員認為的非正常情況。對這種異常情況的處理,需要使用者在程式中定義,然後顯式地在程式中將其引發。

在pl/sql中有三種方式丟擲異常

通過pl/sql執行時引擎——丟擲oracle異常

使用raise語句——丟擲使用者定義異常

1、預定義異常是指oracle系統為一些常見錯誤定義好的異常,例如表中的主鍵值重複,以及除數為0等。

oracle預定義異常:

命名的系統異常

產生原因

access_into_null

未定義物件

case_not_found

case 中若未包含相應的when ,並且沒有設定else 時

collection_is_null

集合元素未初始化

curser_already_open

游標已經開啟

dup_val_on_index

唯一索引對應的列上有重複的值

invalid_cursor

在不合法的游標上進行操作

invalid_number

內嵌的 sql 語句不能將字元轉換為數字

no_data_found

使用select into 未返回行,或應用索引表未初始化的元素時

too_many_rows

執行select into 時,結果集超過一行

zero_divide

除數為0

subscript_beyond_count

元素下標超過巢狀表或varray 的最大值

subscript_outside_limit

使用巢狀表或varray 時,將下標指定為負數

value_error

賦值時,變數長度不足以容納實際資料

login_denied

pl/sql 應用程式連線到oracle 資料庫時,提供了不正確的使用者名稱或密碼

not_logged_on

pl/sql 應用程式在沒有連線oralce 資料庫的情況下訪問資料

program_error

pl/sql 內部問題,可能需要重灌資料字典&pl./sql 系統包

rowtype_mismatch

宿主游標變數與 pl/sql 游標變數的返回型別不相容

self_is_null

使用物件型別時,在null 物件上呼叫物件方法

storage_error

執行 pl/sql 時,超出記憶體空間

sys_invalid_id

無效的rowid 字串

timeout_on_resource

oracle 在等待資源時超時

too_many_rows

select into 語句返回多條記錄

value_error

發生算術,轉換,截斷或大小約束錯誤

zero_divied

檢視講0作為除數

例9.19在pl/sql中將乙個無法表示有效數字的字元轉換為數字,如下:

declare

age varchar2(4) := '14歲';

begin

dbms_output.put_line('測試異常發生前的內容有沒有執行');

dbms_output.put_line(cast(age as number));

dbms_output.put_line('測試異常發生後的內容有沒有執行');

end;

執行的結果:

注意:從執行的結果可以看出,oracle丟擲ora-06502異常,提示字元到數值的轉換錯誤,在丟擲異常後,由於程式中中沒有處理該異常的**,因此程式終止,所以最後的結果是異常發生前的內容被執行,而之後的內容沒有被執行。

對上面的**進行異常處理:

dbms_output.put_line('測試異常發生後的內容有沒有執行');

end;

執行的結果:

2、非預定義異常

除了oracle預定義好的異常以外,還有一些其他異常也屬於程式本身的邏輯錯誤,

例如違反表的外來鍵約束、檢查約束等,oralce只為這些異常提供了錯誤**,而這些異常同樣需要處理,只不過學喲啊在pl/sql塊中使用pragma execption_init語句為該異常設定名稱

declare

***_check exception;

pragma exception_init(***_check,-2290);

begin

insert into student values('路');

exception

when ***_check then

dbms_output.put_line('插入的值違反了***列的檢查約束');

end;/

3、自定義異常

PLSQL 異常處理

1.異常塊begin pl sql塊 exception when no data found then 沒有找到資料 響應命令 when too many rows then 返回多行,隱式游標每次只能檢索一行資料 響應命令 when invalid number then 字元向數字轉換失敗 響...

plsql異常處理

1.在plsql 中 形式引數和 where 語句中的引數不能一樣,否則的話就就會出現個中莫名其妙的錯誤。function validate import supplier p task seq in number,任務號 p line num in number,行號 p vendor name ...

PL SQL異常處理

pl sql提供了良好的異常處理機制,當程式執行出現錯誤時就會觸發異常。異常被觸發時,程式執行即終止,在pl sql塊中提供了異常處理的部分,從而可以捕獲乙個異常進行特殊處理。嚴格意義上來講,乙個完整的pl sql塊應該具有以下結構 declare declare variables begin e...