plsql之pragma exception_init

wisdomone1發表於2013-05-27


---建立
create or replace procedure proc_exception_init
as
my_test_exception exception;
--pragma為編譯器指令 exception_init有2個引數,各為異常名稱和oracle錯誤號碼,即把oracle錯誤號碼和異常名稱聯絡起來
--這樣就可以根據異常名稱在exception模組編寫異常處理功能程式碼了
pragma exception_init(my_test_exception,-36100);

v_a pls_integer;
begin
  v_a:=1;
  if v_a=2 then
  dbms_output.put_line(v_a);
exception
  when   my_test_exception then --可以直接在exception when引用上述宣告定義的my_test_exception異常,而此異常對應一個oracle錯誤程式碼即ora-xxxxx
    dbms_output.put_line('me defined exception');
end;

---exception_init第二引數的取值範圍如下:
error_code
--oracle錯誤碼可以是100或者> -10000000(但排除-1403)的任何錯誤程式碼
Error code to be associated with exception. error_code can be either 100
(the numeric code for "no data found" that "SQLCODE Function" returns) or any negative integer greater
than -10000000 except -1403 (another numeric code for "no data found").


------------下述測試oracle錯誤碼的取值範圍
---如果錯誤碼不在上述的指定範圍內,則報錯
SQL> create or replace procedure proc_uniq
  2  as
  3  exception_test exception;
  4  pragma exception_init(exception_test,1);
  5  begin
  6  insert into t_unique values(1);
  7  commit;
  8  exception
  9  when exception_test then
 10  dbms_output.put_line('insert same record,please change other record');
 11  end;
 12  /
 
Warning: Procedure created with compilation errors
 
SQL> show err
Errors for PROCEDURE TBL_BCK.PROC_UNIQ:
 
LINE/COL ERROR
-------- ------------------------------------------------------------------
3/1      PLS-00701: illegal ORACLE error number 1 for PRAGMA EXCEPTION_INIT


--錯誤碼為100就ok
SQL> create or replace procedure proc_uniq
  2  as
  3  exception_test exception;
  4  pragma exception_init(exception_test,100);
  5  begin
  6  insert into t_unique values(1);
  7  commit;
  8  exception
  9  when exception_test then
 10  dbms_output.put_line('insert same record,please change other record');
 11  end;
 12  /
 
Procedure created

--值為-10000000也報錯
SQL> create or replace procedure proc_uniq
  2  as
  3  exception_test exception;
  4  pragma exception_init(exception_test,-10000000);
  5  begin
  6  insert into t_unique values(1);
  7  commit;
  8  exception
  9  when exception_test then
 10  dbms_output.put_line('insert same record,please change other record');
 11  end;
 12  /
 
Warning: Procedure created with compilation errors
 
SQL> show err
Errors for PROCEDURE TBL_BCK.PROC_UNIQ:
 
LINE/COL ERROR
-------- --------------------------------------------------------------------------
3/1      PLS-00701: illegal ORACLE error number -10000000 for PRAGMA EXCEPTION_INIT


--經測試與官方描述不一致,負數最大界限為-1000000,如果小於它,則報錯,而非官方說的-10000000
SQL> create or replace procedure proc_uniq
  2  as
  3  exception_test exception;
  4  pragma exception_init(exception_test,-1000000);
  5  begin
  6  insert into t_unique values(1);
  7  commit;
  8  exception
  9  when exception_test then
 10  dbms_output.put_line('insert same record,please change other record');
 11  end;
 12  /
 
Procedure created


小結:
      1,pragma exception_init位於儲存過程宣告定部分
      2,真正使用在exception模組,直接引用它的異常即可,編寫對應的異常處理功能程式碼
      3,oracle對一些常用的異常:比如插入重複值或未找到資料,已經把異常名稱與錯誤程式碼聯絡起來,而還有大量的oracle錯誤程式碼未
        進行聯絡工作,此語句即此功能

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-762140/,如需轉載,請註明出處,否則將追究法律責任。

相關文章