#exception #plsql #triggers #procedure
Вопрос:
введите описание изображения здесь СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ТРИГГЕР weekd_tri
BEFORE INSERT OR UPDATE ON payment
FOR EACH ROW
BEGIN
IF TO_CHAR(SYSDATE, 'D') = '1' THEN
RAISE_APPLICATION_ERROR(-20000, 'Cannot make a payment on weekends');
END IF;
END;
ошибка msg
ORA-06512: в «SCOTT.WEEKD_TRI», строка 3 ORA-04088: ошибка во время выполнения триггера ‘СКОТТ,WEEKD_TRI
можете ли вы сказать мне, почему я получаю эту ошибку и как решить эту ошибку
* *этот триггер не должен принимать оплату от клиента при оплате в Сб/Вс, поэтому я написал этот триггер, но когда я попытался вставить данные о Вс, он сработал триггер ORA — 20000 Не может произвести платеж по выходным, и я не смог обновить значения, но кроме этого я получил две другие ошибки ORA-06512 и ORA:04088 **
Комментарии:
1. Привет, Кис, добро пожаловать в SO. Пожалуйста, уточните вопрос, какие данные вы пытаетесь вставить или обновить
2. я пытаюсь обновить таблицу платежей, в которую я добавляю платежные реквизиты клиента
3. чтобы помочь вам, нам нужна инструкция insert или update, которая вызывает ошибку. И дизайн стола тоже было бы неплохо иметь
4. Я благодарю вас за помощь, экочергин, я отредактировал вопрос и добавил картинку для лучшей нетребовательности и относительно НОМЕРА PAY_CUST_ID таблицы(5) PAY_ID НЕ НУЛЕВОЕ ЧИСЛО(5) НОМЕР PAY_AMT(10) ДАТА PAY_DATE ПЕРЕМЕННАЯ PAY_DESC 2(100) это описание таблицы
Ответ №1:
Как видно на вашем скриншоте, я вижу 3 строки сообщения об ошибке
- ORA-20000 — это реальное сообщение об ошибке, вызванное вашей логикой
- ORA-6512 — служебное сообщение для идентификации строки возникшей ошибки кода
- ORA-4088 — другое служебное сообщение для определения имени триггера, в котором произошла ошибка
Итак, причина, по которой вы получаете ora-4088, заключается в команде raise_application_error, которую вы используете для запуска исключений. Это всего лишь часть служебного сообщения для разработчиков
Ответ №2:
Нет никакой «ошибки», кроме той, которую вы создали сами, намеренно.
Какой сегодня день?
SQL> select to_char(sysdate, 'D') from dual;
T
-
1 --> OK, that's the value you're checking in a trigger
SQL>
Таблица образцов:
SQL> create table payment (id number);
Table created.
Спусковой крючок:
SQL> create or replace trigger weekd_tri
2 before insert or update on payment
3 for each row
4 begin
5 if to_char(sysdate, 'D') = '1' then
6 raise_application_error(-20000, 'Cannot make a payment on weekends');
7 end if;
8 end;
9 /
Trigger created.
Тестирование:
SQL> insert into payment (id) values (1);
insert into payment (id) values (1)
*
ERROR at line 1:
ORA-20000: Cannot make a payment on weekends
ORA-06512: at "SCOTT.WEEKD_TRI", line 3
ORA-04088: error during execution of trigger 'SCOTT.WEEKD_TRI'
Правильно; это ИМЕННО то, что вы хотели сделать: IF
пришли к выводу, что сегодня действительно '1'
так, и подняли вопрос об ошибке.
Если бы, например '2'
, вы проверили, сегодня вы могли бы вставить строку:
SQL> create or replace trigger weekd_tri
2 before insert or update on payment
3 for each row
4 begin
5 if to_char(sysdate, 'D') = '2' then
6 raise_application_error(-20000, 'Cannot make a payment on weekends');
7 end if;
8 end;
9 /
Trigger created.
SQL> insert into payment (id) values (2);
1 row created.
SQL>
Комментарии:
1. Спасибо… и да, это работает, обновляет/вставляет значения сегодня, но вопрос, который у меня есть, заключается в том, что я написал заявление о запуске, в котором клиент не может вставлять/обновлять значения в воскресенье, и в моем коде SYSDATE = ‘1’ — воскресенье, но пока я выполнял этот код, помимо ошибки, которую я написал намеренно, также появились две другие ошибки. Для ясного подтекста я обновил вопрос и добавил изображение ошибки, которую я получил вчера
2. Это полный стек ошибок, и, насколько я могу судить, вам его не избежать.
3. Не могли бы вы, пожалуйста, помочь мне понять более кратко или простым способом, если это возможно
4. Чего ты не понимаешь? Вы сказали, что триггер должен вызывать исключение — вот что делает триггер. Конец истории.
5. Я имею в виду полный стек ошибок..?