oracle提供了預定義例外、非預定義例外和自定義例外三種型別。其中預定義例外用於處理常見的oracle錯誤;非預定義例外用於處理預定義所不能處理的oracle錯誤;自定義例外處理與oracle錯誤無關的其他情況。oracle**編寫過程中,如果捕捉例外則會在plsql塊內解決執行錯誤,否則將錯誤傳遞到呼叫環境。
常用預定義例外
為了處理各種常見的
oracle錯誤,plsql為開發人員提供了二十多個預定義例外,每個預定義例外都對應乙個
oracle系統錯誤。
access_info_null(ora-06530):當訪問沒有初始化的物件時觸發。
case_not_found(ora-06592):在case過程中when後沒有包含必要的條件分支並且沒有else子句,則會觸發本異常。
collection_is_null(06531):訪問未初始化的集合元素(巢狀表或者varray)。
cursor_already_open(ora-06511):重新開啟已經開啟的游標。
dup_val_on_index(ora-00001):當中唯一索引所對應的列上鍵入重複值時。
invalid_cursor(ora-01001):試圖在不合法的游標上執行操作時,譬如沒開啟游標就提取內容
invalid_number(ora-01722):當試圖將非法的字串轉換為數字型別時。
no_data_found(ora-01403):執行select into未返回行,或者引用了索引表未初始化的元素時。
too_many_rows(ora-01422):執行select into返回超過一行資料時。
zero_divide(ora-01476):0作為被除數時。
subscript_beyond_count(ora-06533):使用巢狀表或者varray集合時,如果引用下標超過last。
subscript_outside_limit(ora-06532):使用巢狀表或varray集合時,如果引用下標小於first。
value_error(ora-06502):在執行賦值操作時,如果變數長度不足以容納實際資料。
login_denied(ora-01017):連線資料庫時提供了不正確的使用者名稱或口令。
not_logged_on(ora-01012):在程式沒有連線到
oracle資料庫時執行plsql**則會觸發。
program_error(ora-06501):plsql內部問題。
rowtype_mismatch(ora-06504):執行賦值操作時,如果宿主游標變數和plsql游標變數返回型別不相容時。
self_is_null(ora-30625):使用物件型別時,如果在null例項上呼叫成員方法。
storage_error(ora-06500):超出記憶體空間或者記憶體被損壞。
sys_invalid_rowid(ora-01410):無效字串企圖轉換為rowid型別時。
timeout_on_resource(ora-00051):等待資源時出現超時錯誤。
處理非預定義例外:
上面描述的21中預定義之外的其他
oracle錯誤通稱為非預定義例外,對這種例外的處理包括三步:首先的定義部分定義例外;然後使用progma exception(exception_name,exception_number) 在例外和
sql**
declare
e_integrity exception
pragma exception_init(e_integrity,-2291);
begin
sqlstatement;
exception
when e_integrity then
dbms_output.put_line(『資料完整性錯誤。』);
end;
declare
e_integrity exception
pragma exception_init(e_integrity,-2291);
begin
sqlstatement;
exception
when e_integrity then
dbms_output.put_line(『資料完整性錯誤。』);
end;
處理自定義例外:
預定義例外和非預定義例外都跟
oracle錯誤有關,而自定義例外則是使用者根據業務處理時特定的情況而自定義的例外。使用自定義例外時,首先需要在定義部分declare定義例外,然後在執行部分觸發例外(使用raise語句),最後在例外處理部分捕捉並處理以外。
sql**
declare
myexception exception;
begin
if1=0then
raise myexception;
endif;
exception
when myexception then
dbms_output.put_line('asdf');
end;
declare
myexception exception;
begin
if1=0then
raise myexception;
endif;
exception
when myexception then
dbms_output.put_line('asdf');
end;
使用例外函式:
oracle內建函式sqlcode和sqlerrm主要用在others處理器中,分別用來返回
oracle的錯誤**和錯誤訊息。一般情況下sqlcode返回負數標識的
oracle錯誤**,除非錯誤為『ora-01403:no data found』此時對應的sqlcode為+100,對於使用者自定義的異常,sqlcode返回+1,如果沒有異常被觸發,sqlcode返回0。
sql**
begin
exception
when others then
dbms_output.put_line(sqlcode||sqlerrm(sqlcode));
end;
begin
exception
when others then
dbms_output.put_line(sqlcode||sqlerrm(sqlcode));
end;
plsql編譯警告:
plsql警告可以分為三類,severe用於檢查可能出現的不可預料或者錯誤結果,例如引數的別名問題;performance用於檢查可能引起的效能問題,例如執行insert操作時為number列提供了varchar2型別資料;informational用於檢查子程式中的死**;all用於檢查所有警告。為了是的資料庫可以在編譯plsql子程式時發出警告資訊,需要設定初始化引數plsql_warnings。這個引數不僅可以在系統級或者會話級設定,也可以在alter procedure命令中設定。
alter set plsql_warnings=』}』;
為了檢查是否存在對應警告資訊,必須先啟用警告檢查,然後重新編譯子程式,最後使用show errors命令顯示警告錯誤。
sql**
createorreplaceprocedure my_test
isbegin
if1=0then
dbms_output.put_line('test');
endif;
end;
sql> alter
procedure my_test compile plsql_warnings = 'enable:all';
procedure altered
sql> show errors;
errors for
procedure sys.my_test:
line/col error
-------- -------------------------
10/5 plw-06002: 無法執行的**
ORACLE 異常處理
一 開發pl sql程式時,需要考慮到程式執行時可能出現的各種異常,當異常出現時,或是中斷程式執行,或是使程式從錯誤中恢復,從而繼續執行。常用的異常型別有 no data found 沒有發現資料 too many rows select into 語句查詢結果有多個資料行 others 可以捕捉所...
Oracle 異常處理
1 什麼是異常 在pl sql 中的乙個警告或錯誤的情形都可被稱為異常。包括編譯時錯誤 pls 和執行時錯誤 ora 乙個異常通常包含乙個錯誤 和錯誤文字,分別指示異常的編號和具體錯誤資訊。異常情況處理 exception 是用來處理正常執行過程中未預料的事件,程式塊的異常處理預定義的錯誤和自定義錯...
Oracle 異常處理
異常處理 處理程式不可意料的操作,防止程式崩潰,起到友好提示 語法 exception when 異常型別 then 異常處理 異常型別 處理相關的異常 others 處理所有的異常 no data found 沒有找到資料 too many rows 返回資料行數過多自定義異常 實行彈窗的方式提示...