2012-01-26 60 views
0

這是我的代碼:獲取屏幕上的一些額外的異常和消息時,我的觸發器被炒魷魚

CREATE OR REPLACE TRIGGER unsuccessful_logins 
    AFTER INSERT OR UPDATE 
    ON temp_logins 
    for each row 

DECLARE 

     CURSOR c_unsuccessful_attempts 
     IS 
     SELECT * from temp_attempts 
     and user_id= :new.user_id; 

    max_fails EXCEPTION; 


    BEGIN 
     FOR r_unsuccessful_attempts in c_unsuccessful_attempts 
     LOOP 

      if(:new.user_id = r_unsuccessful_attempts.user_id) then 
       if (r_unsuccessful_attempts.locked = 'Y') then 
        raise max_fails; 
       end if; 
      else 
       null; 
      end if; 

     END LOOP;  

EXCEPTION 
    WHEN max_fails THEN 
     RAISE_APPLICATION_ERROR (-20300,'User '''||:new.login_name||''' has reached maximum failed logins. Please contact your system administrator ');  

    END unsuccessful_logins; 

我在我的Oracle應用程序的屏幕得到的錯誤是:

APP-01564: ORACLE error 20300 in fdssgn 
cause: fdssgn failed due to ORA-20300: You have reached maximum failed logins. Please contact your system administrator. 
    ORA-06512: at "APPS.UNSUCCESSFUL_LOGINS",line 24 
    ORA-04088: error during excution of trigger 'APPS.UNSUCCESSFUL_LOGINS'. 

的SQL語句在錯誤的時間被執行爲: INSERT INTO TEMP_LOGINS(USER_ID,ATTEMPT_TIME,TERMINAL_ID,LOGIN_NAME) 值(:USER_ID,SYSDATE,:erminal_id,:LOGIN_NAME)

我只是想顯示ORA-20300: You have reached maximum failed logins. Please contact your system administrator部分。

而想要忽略:

ORA-06512: at "APPS.UNSUCCESSFUL_LOGINS",line 24 
    ORA-04088: error during excution of trigger 'APPS.UNSUCCESSFUL_LOGINS'. 
    The SQL statement being executed at the time of the error was: 
INSERT INTO TEMP_LOGINS (USER_ID, ATTEMPT_TIME,TERMINAL_ID,LOGIN_NAME) 
values(:user_id, sysdate,:erminal_id,:login_name) 

我怎樣才能獲得在屏幕上驅除掉這些額外的信息?

+4

什麼是你看到的消息和錯誤?什麼是表格定義? (爲什麼你一直使用遊標;甚至不把用戶ID作爲參數傳遞給它?) –

+3

你得到了什麼額外的例外和消息?另外,當你可以直接查詢你感興趣的鎖定記錄時,爲什麼要從temp_attempts表中拉出所有記錄並循環它們呢? –

+0

+1給亞歷克斯說我在發佈之前的想法。 –

回答

0

我不知道你所說的 'Oracle應用程序' 的意思到底是什麼,但this link可以幫助;它有一個關於異常處理的部分。

正如我在先前的評論中所建議的那樣,我懷疑你的應用程序代碼中需要一些東西來捕捉並優雅地處理由觸發器引發的異常,所以圍繞insert語句的某種包裝。該鏈接特別討論處理表單中的異常,這可能很清楚,但我不太瞭解,但如果您使用的是相關內容,則主體可能會相同。

適應他們的榜樣咯,這樣的事情可能適合認爲你想要做的事:

DECLARE 
    too_many_attempts EXCEPTION; 
    PRAGMA EXCEPTION_INIT(too_many_attempts, -20300); 
BEGIN 
    INSERT INTO TEMP_LOGINS (USER_ID, ATTEMPT_TIME,TERMINAL_ID,LOGIN_NAME) 
    values(:user_id, sysdate,:erminal_id,:login_name); 
EXCEPTION 
    WHEN too_many_attempts THEN 
     fnd_message.set_string(SQLERRM); 
     fnd_message.error; 
     RAISE FORM_TRIGGER_FAILURE; 
END; 
+0

非常感謝Alex。該鏈接非常有用。是的,你是對的,它的oracle應用程序形式。我現在試試看。 – prashant1988

+0

非常感謝您的鏈接。我閱讀了整篇文章,並最終找到了解決方案。其實沒有必要去觸摸我的應用程序代碼。我在我的觸發器代碼中提到了以下內容:FND_MESSAGE.SET_NAME('FND','FLEX-USER DEFINED ERROR'); \t \t FND_MESSAGE.SET_TOKEN('MSG','您已達到最大失敗登錄次數,該帳戶已被暫時鎖定,請聯繫您的管理員'); APP_EXCEPTION.RAISE_EXCEPTION; 'FLEX-USER DEFINED ERROR'是我必須爲我的應用程序設置的消息代碼。它爲我工作。萬分感謝! – prashant1988

+0

@ prashant1998 - 很樂意提供幫助。如果鏈接有幫助,隨時歡迎/接受! –

0

簡單的答案是,您不能省略RAISE_APPLICATION_ERROR的輸出。您可以考慮使用dbms_output.put_line來提供單個消息。

...

WHEN max_fails THEN 
    dbms_output.put_line('User Message'); 
+0

謝謝!我也在想同樣的事情。但問題是:它能在我的oracle應用程序屏幕上顯示一個彈出消息嗎? – prashant1988

+0

我試過使用dbms_output.put_line。它在後端引發異常,但沒有彈出窗口。屏幕上沒有錯誤。請幫忙! – prashant1988