Получение некоторых дополнительных исключений и сообщений на экране при срабатывании моих триггеров
Это мой код:
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');