異常指的是在程式執行過程中發生的異常事件,通常是由硬體問題或者程式設計問題所導致的。
pl/sql程式設計過程中,即使是寫得最好的程式也可能會遇到錯誤或未預料到的事件。乙個健壯的程式都應該能夠正確處理各種異常情況,並盡可能從中恢復。
1. 異常處理
異常處理是用來處理正常執行過程中未預料的事件。pl/sql程式塊一旦產生異常而沒有指出如何處理時,程式就會自動終止整個程式執行。
pl/sql程式設計過程中,有三種型別的異常:
1.預定義異常
對這種異常情況的處理,無需在程式中定義,當pl/sql程式違反oracle規則或超越系統限制時隱式引發。
2.非預定義異常
其他標準的oracle錯誤。對這種異常情況的處理,需要使用者在程式中定義,然後由oracle自動將其引發。
3.使用者定義異常
程式執行過程中,出現程式設計人員認為的非正常情況。對這種異常情況的處理,需要使用者在程式中定義,然後顯式地在程式中將其引發。
異常處理通常放在pl/sql程式的後部,語法結構為:
exception
when
then statement [ statement ]...
2. 預定義的異常處理
常見預定義異常:
錯誤號異常名稱
說明ora-00001
dup_val_on_index
重複索引值,違反了唯一性限制,當在唯一索引所對應的列上鍵入重複值時觸發
ora-01001
invalid_cursor
試圖使用乙個無效的游標
ora-01012
not_logged_on
沒有連線到oracle
ora-01017
login_denied
無效的使用者名稱/口令
ora-01403
no_data_found
沒有找到資料時觸發
ora-01422
too_many_rows
返回多行
ora-01722
invalid_number
轉換為數字失敗時觸發
ora-06511
cursor_already_open
試圖開啟乙個已處於開啟狀態的游標
ora-06592
case_not_found
當case條件都不滿足時觸發
對預定義異常的處理,只需在pl/sql塊的異常處理部分,直接引用相應的異常情況名,並對其完成相應的異常錯誤處理即可。
示例1:
declare
stock_price number := 9.73;
net_earnings number := 0;
pe_ratio number;
begin
pe_ratio := stock_price / net_earnings;
dbms_output.put_line('運算結果 = ' || pe_ratio);
exception
when zero_divide then
dbms_output.put_line('/ by zero');
pe_ratio := null;
end;
執行結果:
/ by
zero
為避免除0異常,可以採用如下示例2方式解決:
示例2:
declare
stock_price number := 9.73;
net_earnings number := 0;
pe_ratio number;
begin
pe_ratio :=
case net_earnings
when
0then
null
else stock_price / net_earnings
end;
end;
示例3:
declare
default_number number := 0;
begin
insert
into t values(to_number('100.00', '9g999'));
exception
when invalid_number then
dbms_output.put_line('使用預設值替換非法數字');
insert
into t values(default_number);
end;
執行結果:
使用預設值替換非法數字
3. 非預定義的異常處理
非預定義異常有錯誤號沒有名字,處理的辦法是:自己定義乙個名字,繫結到錯誤號,捕獲錯誤名。處理這類異常,首先必須對非預定義的oracle異常進行定義。
如:
myexcp exception;
然後使用exception_init語句與標準的oracle錯誤聯絡起來,如:
pragma exception_init(myexcp,-02292);
說明:ora-02292是違反完整性約束的錯誤**。
示例:
declare
myexcp exception;
pragma exception_init(myexcp,-02292);
dno scott.emp.deptno%type;
begin
dno := &dept_no;
delete
from scott.dept where deptno=dno;
exception
when myexcp then
delete
from scott.emp where deptno=dno;
delete
from scott.dept where deptno=dno;
end;
4. 使用者定義異常處理
我們可以在任何pl/sql匿名塊,子程式或包的宣告部分宣告自己的異常。使用者定義的異常是通過使用raise語句顯式觸發的。
一般使用者定義異常的處理流程為:定義異常->丟擲異常->捕獲及處理異常。
示例:
declare
invalidcategory exception; -- 定義異常
category varchar2(10);
begin
category := '&category';
if category not
in ('附件','頂蓋','備件') then
raise invalidcategory; -- 丟擲異常
else
dbms_output.put_line('您輸入的類別是'|| category);
endif;exception
when invalidcategory then -- 捕獲及處理異常
dbms_output.put_line('無法識別該類別');
end;
如果指定true,pl/sql把error_code上的錯誤資訊新增到堆疊的頂部。指定false,pl/sql替換error_code錯誤堆疊,預設值為false。
示例1:
declare
empno employees.employee_id%type;
no_such_row exception;
begin
empno := &empno;
update employees set salary = salary+100
where id = empno;
if sql%notfound then
raise no_such_row;
endif;exception
when no_such_row then
end;
示例2:
begin
update emp set deptno=80
where empno=1111;
if sql%notfound then
endif;
exception
when others then
dbms_output.put_line(sqlcode||'-->'||sqlerrm);
end;
sqlcode用於取得oracle錯誤號。
sqlerrm則用於取得與之相關的錯誤訊息。
ORACLE資料庫PLSQL筆記
oracle資料庫plsql筆記 pl sql 是oracle的程式語言,用於擴充套件sql的程式設計能力,為資料庫程式增加了許多可能的功能。它允許將過程控制語句與 sql語句結合使用oracle 特有的程式語言pl sql補充了標準的關聯式資料庫語言sql,提供了各種過程化特性,包括迴圈 if t...
PLSQL連線oracle資料庫
方法一 instantclient 12 2 1 安裝 instantclient 12 2 軟體 免安裝oracle客戶端 2 plsql配置 開啟plsql 點取消,彈出plsql主介面 選單欄的tools 屬性preferences 首選項 連線 3 連線資訊 1 連線資訊 可以是ip 152...
plsql 匯出oracle資料庫
plsql 匯出資料庫有兩個問題,乙個是只匯出結構,乙個是匯出表結構加資料這樣的,首先人家讓我導成sql語句 這不是簡單,首先開啟plsql 一 匯出結構 1 然後tools export user objects.然後出來一片空白 2 要選擇哪個user 3 上面會出現好多表,選擇一下你要匯出的表...