Получение некоторых дополнительных исключений и сообщений на экране при срабатывании моих триггеров

Это мой код:

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)

Как я могу избавиться от этих лишних сообщений на экране?

2 ответа

Решение

Я не уверен, что именно вы подразумеваете под "приложениями оракула", но эта ссылка может помочь; у него есть раздел по обработке исключений.

Как я предлагал в предыдущем комментарии, я подозреваю, что вам нужно что-то в коде приложения, чтобы перехватить и корректно обработать исключение, вызванное триггером, так что какая-то оболочка вокруг оператора вставки. В ссылке конкретно говорится об обработке исключения в Forms, с которым (как, наверное, вполне понятно) я не знаком, но принципал, вероятно, будет таким же, если вы используете что-то связанное.

Немного адаптировав их пример, что-то вроде этого может соответствовать тому, что, я думаю, вы пытаетесь сделать:

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;

Ответ прост: вы не можете опустить вывод RAISE_APPLICATION_ERROR. Вы можете использовать dbms_output.put_line для предоставления одного сообщения.

...

WHEN max_fails THEN 
  dbms_output.put_line('User Message');
Другие вопросы по тегам