ошибка при создании триггера, который должен повысить - PullRequest
0 голосов
/ 30 ноября 2018

Хорошо, поэтому я пытаюсь запустить этот код:

Create or replace trigger modificare_datar
After Insert or Update of datar
ON Imprumut
for each row

Begin

if datar<datai or datar>sysdate
then Raise_application_error(-20500,'Eroare! datar nevalida');
end if;

End;

Но я получаю следующую ошибку:

Error at line 3: PL/SQL: Statement ignored


1. Create or replace trigger modificare_datar
2. After Insert or Update of datar
3. ON Imprumut
4. for each row
5. Begin

Что я хочу сделать, это создать триггер, который вызываетошибка, потому что дата даты, которую я хочу обновить, или при вставке меньше другой даты (datai) или больше sysdate.Но я на самом деле не знаю, почему он получает меня и ошибки.Если нет, я бы хотел, чтобы в параметре подъема и ошибки было задано значение sysdate для дататора, но если я попытаюсь создать триггер, я получу 2 ошибки при попытке его запуска (я обнаружил, что это происходит потому, что он будет продолжаться).цикл) Можете ли вы помочь мне?

РЕДАКТИРОВАТЬ:

Хорошо, я попробовал этот код

Create or replace trigger modificare_datar 
After Insert or Update of datar ON Imprumut 
for each row 
Begin 
    if :new.datar<:new.datai or :new.datar>sysdate then 
        Raise_application_error(-20500,'Eroare! datar nevalida'); 
    end if; 
End; 

, и он позволяет мне создать его, но теперь я получаю следующееошибка при срабатывании триггера

ORA-20500: Eroare! datar nevalida ORA-06512: at "RO_A372_SQL_S20.MODIFICARE_DATAR", line 4 ORA-04088: error during execution of trigger 'RO_A372_SQL_S20.MODIFICARE_DATAR' 2. set datar='26-Nov-2018' 3. where id_carte=6 and id_imp=4

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Это может быть то, что вы ищете.Посмотрите:

Пример таблицы:

SQL> create table imprumut
  2    (id     number,
  3     datar  date,
  4     datai  date);

Table created.

Триггер: вы забыли , чтобы указать, на какие значения вы ссылаетесь:

SQL> create or replace trigger trg_biu_imp
  2    before insert or update on imprumut
  3    for each row
  4  begin
  5    if :new.datar < :new.datai or :new.datar > sysdate then
  6       raise_application_error(-20500, 'Eroare! datar nevalida');
  7    end if;
  8  end;
  9  /

Trigger created.

Тестирование:

SQL> -- datar < datai: error
SQL> insert into imprumut (id, datar, datai) values
  2    (1, date '2018-11-30', date '2018-12-20');
insert into imprumut (id, datar, datai) values
            *
ERROR at line 1:
ORA-20500: Eroare! datar nevalida
ORA-06512: at "SCOTT.TRG_BIU_IMP", line 3
ORA-04088: error during execution of trigger 'SCOTT.TRG_BIU_IMP'


SQL> -- datar > sysdate (2018-11-30): error
SQL> insert into imprumut (id, datar, datai) values
  2    (2, date '2020-01-01', date '2018-12-20');
insert into imprumut (id, datar, datai) values
            *
ERROR at line 1:
ORA-20500: Eroare! datar nevalida
ORA-06512: at "SCOTT.TRG_BIU_IMP", line 3
ORA-04088: error during execution of trigger 'SCOTT.TRG_BIU_IMP'


SQL> -- datar > datai, datar < sysdate: OK
SQL> insert into imprumut (id, datar, datai) values
  2    (3, date '2018-11-01', date '2018-08-20');

1 row created.

SQL>
0 голосов
/ 30 ноября 2018

Первая проблема, как вы уже поняли, заключается в том, что вам нужно :new.datar (или :old.datar, в зависимости от ситуации), чтобы получить значение даты записи, которую вы вставляете или обновляете.

Другие проблемы с дополнительными ошибками на самом деле не являются проблемой.Первый - это фактическая ошибка с правильным кодом и правильным текстом.Другая часть - это дополнительная информация, которая поможет вам определить дополнительную информацию об ошибке, если вас это заинтересует.Таким образом, вы получаете ORA-06512, который следует 'трассировке стека', чтобы сказать вам, на какой линии что-то пошло не так.Это может быть полезно, особенно если вы получили больше кода или если вы вызываете хранимые процедуры из триггера.Используя эту информацию, вы можете проследить все шаги от звонка до места возникновения ошибки.

Таким образом, вся эта дополнительная информация не является частью фактического сообщения об ошибке.Когда вы будете использовать SQLCODE и SQLERRM, вы получите только первое число и первое сообщение (которое вы подняли).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...