PL/SQL-異常處理機制

PL/SQL的語法中,存在異常處理機制。當PL/SQL程序出錯時,會引發異常處理機制,異常處理代碼通常放在PL/SQL塊的exception中。說白了,就是出錯了還能彌補過錯。
異常分爲兩種:

  1. 預定義異常
    用戶無需定義,也無需引發,由Oracle自動引發。
  2. 自定義異常
    用戶自己定義,報錯了能快速的定位錯誤

預定義異常

學習是爲了學以致用,系統預定義的異常有很多,大約20個,這這裏只介紹常用的幾個。

  1. zero_divide【除數不能爲0,當除數爲0時引發異常】
    boolean型變量,返回值爲true或false
    需求:計算兩數和除以兩數查的結果,若兩個數相同,則輸出“a和b相等。”
--不會引發異常的情況
set serveroutput on
declare
  a int:=100;
  b int:=200;
  c number;
begin
  c:=(a+b)/(a-b);
  dbms_output.put_line('兩數和除以兩數差等於'||c);
exception
  when zero_divide then
    dbms_output.put_line('a和b相等。');
end;
/
--會引發異常的情況
set serveroutput on
declare
  a int:=100;
  b int:=100;
  c number;
begin
  c:=(a+b)/(a-b);
  dbms_output.put_line('兩數和除以兩數差等於'||c);
exception
  when zero_divide then
    dbms_output.put_line('a和b相等。');
end;
/
  1. too_many_rows【返回多行數據,當返回多行數據時引發】
    boolean型變量,返回值爲true或false
    需求:檢查部門爲10的員工是否只有一人,是的話輸出“員工編號XXX的姓名爲XXX”,若有多人,則返回“部門爲10的員工不止一人。”
set serverpoutput on
declare
  var_ename emp.ename%type;
  var_empno emp.empno%type;
begin
--返回數據超過一行
  select empno,ename into var_empno,var_ename from emp where deptno=10;
  dbms_output.put_line('員工編號'||var_empno||'的姓名爲'||var_ename);
exception
  when too_many_rows then
    dbms_output.put_line('部門爲10的員工不止一人。');
end;
/
  1. no_date_found【若返回0行數據,則引發異常】
    boolean型變量,返回值爲true或false
    需求:檢查部門爲50的員工是否存在,存在則輸出“員工編號XXX的姓名爲XXX”,若不存在,則返回“不存在部門爲50的員工”
set serverpoutput on
declare
  var_ename emp.ename%type;
  var_empno emp.empno%type;
begin
--返回數據爲空
  select empno,ename into var_empno,var_ename from emp where deptno=50;
  dbms_output.put_line('員工編號'||var_empno||'的姓名爲'||var_ename);
exception
  when no_data_found then
    dbms_output.put_line('不存在部門爲50的員工');
end;
/

自定義異常

在這裏先介紹一種特殊的數據類型:異常類型(exception)

declare
  error_00001 exception; --定義異常變量
  pragma exception_init(error_00001,-00001); --將錯誤編號與異常變量綁定

綁定後,error_00001異常變量就可以當作預定義異常來使用了。

  1. 錯誤編號異常【將異常變量與系統的錯誤編號綁定,用異常變量來代替這類錯誤。】
    當Oracle系統發生錯誤時,會報錯,報錯會顯示錯誤編號和相關描述信息。如:ORA-00001:違反唯一約束條件<…>
    對於一些要捕捉的異常,系統報錯時顯示的報錯信息可能不是那麼好理解,如可以把“ORA-00001:違反唯一約束條件<…>”顯示爲“主鍵不能重複!”,相信每個人看到這個報錯都能快速的去檢查主鍵是否重複。
set serveroutput on
declare
  error_00001 exception;
  pragma exception_init(error_00001,-00001);
begin
  insert into emp(empno,ename,sal) values(7369,'Abong',500);
  dbms_output.put_line('編號7369的名字爲Abong,工資爲500');
exception
  when error_00001 then
    dbms_output.put_line('主鍵不能重複');
end;
/
  1. 業務邏輯異常【自己決定什麼時候引發異常,異常處理內容是什麼】
    前面所講的所有異常,可以說都是系統裏有的。我們回看這個需求:
    計算兩數和除以兩數查的結果,若兩個數相同,則輸出“a和b相等。”
    如果要在begin中按自行檢驗,發現兩個數相同,才引發異常,這種要怎麼寫呢?
set serveroutput on
declare
  a int:=100;
  b int:=100;
  c number;
  zero_divide_exception exception; --定義異常變量
begin
  if a=b then
    raise zero_divide_exception;  --何時引發異常
  else
    c:=(a+b)/(a-b);
    dbms_output.put_line('兩數和除以兩數差等於'||c);
  end if;
exception  
  when zero_divide_exception then   --當異常引發時,異常處理內容是什麼?
    dbms_output.put_line('a和b相等。');
end;
/

以上就是PL/SQL中的異常處理機制,遇到錯誤不慌,只要設置好異常處理機制,就能快速的定位錯誤,並訂正錯誤。

發佈了26 篇原創文章 · 獲贊 17 · 訪問量 7591
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章