В чем я ошибся при создании TRIGGER? что мне делать? - PullRequest
0 голосов
/ 08 апреля 2020

НАЖМИТЕ ЗДЕСЬ, ЧТОБЫ УВИДЕТЬ ИЗОБРАЖЕНИЕ

После создания триггера я получил предупреждение:

Триггер создан с ошибками компиляции

Что мне делать?

SQL> create trigger customer_trig
  2  BEFORE INSERT OR UPDATE OR DELETE ON customer1
  3  FOR EACH ROW
  4  BEGIN
  5  set customer1.t_cost=customer1.pprice*customer1.tq
  6  END;
  7  /

Warning: Trigger created with compilation errors.

SQL> desc customer1;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------

 CID                                                VARCHAR2(10)
 NAME                                               VARCHAR2(20)
 PNAME                                              VARCHAR2(15)
 PPRICE                                             NUMBER(5)
 TQ                                                 NUMBER(5)
 T_COST                                             NUMBER(7)

SQL> insert into customer1 values('ssr345','vikram','book',30,12,0);
insert into customer1 values('ssr345','vikram','book',30,12,0)
            *
ERROR at line 1:
ORA-04098: trigger 'RAYUDU.CUSTOMER_TRIG' is invalid and failed re-validation


Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Вы не используете триггер правильно. Вы должны использовать :NEW для ссылки на новое значение, а событие ON DELETE здесь не требуется.

Я думаю, вам нужно следующее:

CREATE TRIGGER CUSTOMER_TRIG BEFORE
    INSERT OR UPDATE 
    --OR DELETE 
    ON CUSTOMER1
    FOR EACH ROW
BEGIN
    :NEW.T_COST := :NEW.PPRICE * :NEW.TQ;
END;
/
0 голосов
/ 10 апреля 2020

Как спросил @jarlh, Oracle имеет вычисляемые столбцы. В Oracle говорят, что это виртуальная колонка. И это лучшее решение здесь. Переопределите столбец T_COST как виртуальный столбец. Если ваша таблица уже существует, то:

alter table customer1 drop column t_cost;    
alter table customer1 add ( t_cost number(7) generated always as (pprice * tq ) virtual); 

Примечание. Вышеприведенное не требует «всегда генерируемых», а не «виртуальных» фраз, но повышает удобочитаемость (по крайней мере, IMO);

...