Получение некоторых дополнительных исключений и сообщений на экране при срабатывании моих триггеров - PullRequest
0 голосов
/ 26 января 2012

Это мой код:

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 part.

И хочупропустить:

    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 ]

0 голосов
/ 28 января 2012

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

Как я уже говорил в предыдущем комментарии, я подозреваю, что вам нужно что-то в коде приложения, чтобы перехватывать и корректно обрабатывать исключение, вызванное триггером, поэтому какая-то оболочка вокругвставить заявление.В ссылке конкретно говорится об обработке исключения в 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;
0 голосов
/ 27 января 2012

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

...

WHEN max_fails THEN 
  dbms_output.put_line('User Message');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...