pl/sql提供了良好的異常處理機制,當程式執行出現錯誤時就會觸發異常。異常被觸發時,程式執行即終止,在pl/sql塊中提供了異常處理的部分,從而可以捕獲乙個異常進行特殊處理。
嚴格意義上來講,乙個完整的pl/sql塊應該具有以下結構:
declare
--declare variables
begin
--execute & exception raised
exception
--handle exception
end;
oracle資料庫預先定義了一系列異常,以下是常見的一些:
access_into_null(ora-06530):引用物件型別變數的屬性時,未對變數進行初始化;
case_not_found(ora-06592):使用case-when結構時,未使用else子句,並且處理了不包含的case條件;
collection_is_null(ora-06531):引用集合型別元素時,未對集合型別變數初始化;
cursor_already_open(ora-06511):使用open命令開啟已經處於開啟狀態的顯式游標;
dul_val_on_index(ora-00001):在唯一約束的列上插入重複的值時會觸發;
invalid_number(ora-01722):不能將字元轉換為合理的數字時會觸發;
no_data_found(ora-01403):select語句未返回行或引用未初始化的索引表元素;
too_many_rows(ora-01422):select into時,返回資料超過一行時即被觸發;
zero_devide(ora-01476):除0異常;
subscript_beyound_count(ora-06533):使用陣列型別是,下標超出元素範圍;
subscript_outside_limit(ora-06532):使用巢狀表或varry元素時,使用了負數作為下標;
value_error(ora-06502):賦值操作時,變數長度不足以容納實際資料長度
rowtype_mismatch(ora-06504):位游標變數賦值時,返回型別與游標定義型別不一致
除這些異常之外,開發者也可以進行自定義異常,並自定義處理規則。自定義異常的處理步驟如下:
1.在declare部分定義乙個異常變數;
2.在begin處理中使用raise丟擲乙個異常;
3.在exception部分進行處理
其中,使用sqlcode,sqlerrm這兩個函式可以檢視錯誤號和對應的錯誤訊息;
該語法用於自定義錯誤訊息,err_number必須在-20000到-20999之間,err_msg指定錯誤訊息,長度不能超過2048位元組,第三個值用於控制錯誤堆疊資訊的存放內容,預設為false,即觸發時會替換之前所有的錯誤,指定為true時會將這次的錯誤存放在錯誤堆疊中。只能在過程、函式、觸發器、包中使用,不能在匿名塊或子程式中使用;
使用以下**建立儲存過程,用於觸發乙個自定義錯誤訊息的異常:
create or replace procedure comm_r(
eno number,comm number)
isv_comm emp.comm%type;
begin
select comm into v_comm from emp where empno=eno;
if v_comm is null then
end if;
exception
when no_data_found then
dbms_output.put_line('no such emp exists');
end;
使用以下命令呼叫,得到結果如下:
sql> exec comm_r(7788,100);
begin comm_r(7788,100); end;
ora-20001: this guy has no comm!
ora-06512: 在 "scott.comm_r", line 8
ora-06512: 在 line 1
pl sql異常處理
丟擲異常 oracle有三種型別的異常錯誤 1 預定義 predefined 異常 oracle預定義的異常情況大約有24個。對這種異常情況的處理,無需在程式中定義,由oracle自動將其引發。2 非預定義 predefined 異常 即其他標準的oracle錯誤。對這種異常情況的處理,需要使用者在...
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 ...