2015-05-22 78 views
1

我在PL/SQL觸發器中引發了一條錯誤消息,它工作正常,除了它返回的錯誤多於指定給應用程序的錯誤。除了自定義錯誤之外,我還會獲得有關發生錯誤的行和觸發器的信息。從RAISE_APPLICATION_ERROR中排除額外的錯誤信息

例如,它會得到

ORA-20111: There is a custom error here 
ORA-06512: at "{schema_name}.{trigger_name}", LINE 2 
ORA-04088: error during execution of trigger {schema_name}.{trigger_name}<br> 
.Operation canceled. 

什麼其實我想要的是:

ORA-20111: There is a custom error here 

如何刪除從錯誤信息的額外信息則返回到我的應用程序之前?我下面的測試代碼...

CREATE OR REPLACE TRIGGER CUSTOM_ERROR 
BEFORE INSERT OR UPDATE ON {SCHEMA_NAME}.{TABLE_NAME} FOR EACH ROW 
BEGIN 
    RAISE_APPLICATION_ERROR(-20111, 'There is a custom error here'); 
END; 
+0

而你的代碼看起來像?我沒有看到你發佈的任何代碼。你如何處理例外情況? –

+0

@LalitKumarB沒有處理。爲您調整了代碼。我希望用戶從應用程序中看到這個錯誤。它只是顯示它從Oracle收到的錯誤。我希望這個錯誤完全是我放入RAISE_APPLICATION_ERROR的東西,而不是更多 – user1567453

+0

但是這不會引起已定義的異常並且只有用戶定義的異常。 –

回答

1

你可以使用RAISE_APPLICATION_ERROR

例如,

SQL> DECLARE 
    2 custom_err EXCEPTION; 
    3 PRAGMA EXCEPTION_INIT(custom_err, -20099); 
    4 BEGIN 
    5 raise_application_error(-20099, 'This is a custom error'); 
    6 EXCEPTION 
    7 WHEN custom_err THEN 
    8 dbms_output.put_line(sqlerrm); 
    9 END; 
10/
ORA-20099: This is a custom error 

PL/SQL procedure successfully completed. 

SQL> 

PRAGMA EXCEPTION_INIT是給一個自定義的錯誤編號,這可能範圍從-20001-20999

但是,你需要照顧變化已經定義的例外被引發。

例如,

SQL> DECLARE 
    2 custom_err EXCEPTION; 
    3 PRAGMA EXCEPTION_INIT(custom_err, -20099); 
    4 v number; 
    5 BEGIN 
    6 SELECT empno INTO v FROM emp WHERE empno = 1234; 
    7 raise_application_error(-20099, 'This is a custom error'); 
    8 EXCEPTION 
    9 WHEN custom_err THEN 
10 dbms_output.put_line(sqlerrm); 
11 END; 
12/
DECLARE 
* 
ERROR at line 1: 
ORA-01403: no data found 
ORA-06512: at line 6 


SQL> 

有一個NO_DATA_FOUND拋出異常。你可以抑制這個,但是,它會把錯誤堆棧留給額外的消息。

SQL> DECLARE 
    2 custom_err EXCEPTION; 
    3 PRAGMA EXCEPTION_INIT(custom_err, -20099); 
    4 v number; 
    5 BEGIN 
    6 SELECT empno INTO v FROM emp WHERE empno = 1234; 
    7 raise_application_error(-20099, 'This is a custom error'); 
    8 EXCEPTION 
    9 WHEN no_data_found THEN 
10  raise_application_error(-20099, 'This is a custom error'); 
11 WHEN custom_err THEN 
12 dbms_output.put_line(sqlerrm); 
13 END; 
14/
DECLARE 
* 
ERROR at line 1: 
ORA-20099: This is a custom error 
ORA-06512: at line 10 


SQL> 

我總是希望儘可能詳細地記錄錯誤。 raise_application_error對於在應用程序上顯示自定義消息很有用,但是,我會記錄程序中的所有錯誤。

請看看:

  • dbms_utility.format_error_stack
  • dbms_utility.format_error_backtrace
+0

儘管如此,它並沒有將異常傳遞給應用程序。您可以發回一個字符串,當然,例如作爲輸出參數 - 包裝導致觸發器在過程中觸發的語句 - 但是然後您使用自己的錯誤處理過程,而不是內置的異常處理。 –

+0

@AlexPoole在生產代碼中看到dbms_output將是一場噩夢。是的,你是對的,我的意思是將它作爲一個PL/SQL單元的OUT參數傳遞給應用程序。 –

+0

據我瞭解這個答案,我將不得不讓應用程序(MapInfo)更改它發送到數據庫的插入/更新SQL是一個過程調用,它獲得返回值?不幸的是,我不能改變客戶端應用程序的功能,所以它不可能:( – user1567453