Oracle pragma 舉例:exception_init

來源:互聯網
上載者:User

PRAGMA是一個編譯指示(或命令)。編譯指示在編譯時間被處理,它們不在運行時執行。編譯指示是對編譯器發出的特殊指令。它也稱為偽指令(pseudoinstruction),不會改變程式的含義。它只是向編譯器傳遞資訊 ,實際上它是非常類似於嵌在 SQL 陳述式的注釋中的效能調整提示。

EXCEPTION_INIT:將一個特定的錯誤號碼與程式中所聲明的異常標示符關聯起來。

樣本:PRAGMA EXCEPTION_INIT(DEADLOCK_DETECTED, -60);

EXCEPTION_INIT編譯指令,即EXCEPTION的初始化。文法也簡單,PRAGMA EXCEPTION (exception_name, error_number);在處理EXCEPTION 是,當沒有已經定義好了的EXCEPTION NAME可用時,我們就用OTHERS來處理未被捕捉的所有的EXCEPTION,PL/SQL設計者建議大家盡量使用已知的EXCEPTION NAME來捕捉,不到最後,www.bkjia.com盡量不用這個選項,雖然不知道為什麼,但估計是跟效能有關,而且編譯出來的代碼應該會很長。

這個編譯指令的引入也為這帶來瞭解決方案。比如,我們要捕捉死結這個EXCEPTION怎麼辦? 系統沒有預定義好的EXCEPTION NAME可用。這時我們就可以用這個編譯指令了。

ora-60錯誤是代表死結的意思,那我們就可以為這個錯誤號碼起一個EXCEPTION NAME,比如DEADLOCK_DETECTED,文法如下:

DECLARE
DEADLOCK_DETECTED EXCEPTION;
PRAGMA EXCEPTION_INIT(DEADLOCK_DETECTED, -60);

好我們就可以像下面一樣來捕捉處理這個死結的EXCEPTION了。

EXCEPTION
WHEN DEADLOCK_DETECTED THEN
......

這樣,我們就避免了用when others then來捕捉處理這個異常了。

這個編譯指令幾乎可以用在所有的程式的聲明項中,但要注意作用範圍,另外要注意的是記住只為一個錯誤號碼起一個EXCEPTION NAME。

下面附上一段通過SQLERRM函數找出Oracle預定義的錯誤號碼及相應的錯誤資訊。www.bkjia.com這在10g版本通過,在之前的版本可能會報buffer overflow錯誤,這是由於set serveroutput on預設為2000位元組,但在10g中預設是unlimited了。

SET SERVEROUTPUT ON
SPOOL ERRORMSG.LOG
DECLARE
VMSG VARCHAR2(500);
BEGIN
FOR I IN 0..20000 LOOP
VMSG := SQLERRM(-I);
IF INSTR(VMSG,'not found') = 0 THEN
DBMS_OUTPUT.PUT_LINE(VMSG);
END IF;
END LOOP;
END;
/

SPOOL OFF

下面看一個例子

create or replace procedure SP_Del_Test
(P_ItemAdmin in mfitem.itemadmin%type, --ItemAdmin
 P_ItemCd    in mfitem.itemcd%type, --ItemCode
 P_Return    out number --輸出參數
 ) is
  exp exception;
  PRAGMA Exception_Init(exp, -2292);
begin
  delete from mfitem t
   where t.itemcd = P_ItemCd
     and t.itemadmin = P_ItemAdmin;  --這一句會引發-2292異常,有級連刪除異常
EXCEPTION
  WHEN EXP THEN
    P_Return := 9;
    ROLLBACK;
  WHEN OTHERS THEN
    ROLLBACK;
end SP_Del_Test; 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.