Как сделать триггер с приращением значений в столбце? - PullRequest
0 голосов
/ 05 мая 2020

У меня две таблицы TRIP и DRIVER. Когда новый набор значений вставляется в TRIP (чтобы указать, что совершается новое путешествие), значения в столбце TOTALTRIPMADE (который в настоящее время пуст) в таблице DRIVER увеличиваются на единицу. Триггер должен распознать, какую строку следует обновить с помощью сделанного мной оператора select.

Это триггер, который я сделал:

CREATE OR REPLACE TRIGGER updatetotaltripmade
AFTER INSERT ON trip
FOR EACH ROW
ENABLE

BEGIN
    UPDATE DRIVER 
    SET TOTALTRIPMADE := OLD.TOTALTRIPMADE+1
    WHERE (SELECT L#
        FROM TRIP
        INNER JOIN DRIVER
        ON TRIP.L# = DRIVER.L#;)

END;
/

Однако я получаю эту ошибку: ORA-04098: trigger 'CSCI235.UPDATETOTALTRIPMADE' is invalid and failed re-validation

Что мне нужно отредактировать в моем коде, чтобы мой триггер работает? Спасибо!

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Одна ошибка, которую вы сделали, - это попытка сослаться на OLD.TOTALTRIPMADE в предложении SET, поскольку псевдоним OLD не существует, и если таблица TRIP не содержит столбец TOTALTRIPMADE, тогда запись :OLD выиграла ' t также содержит столбец TOTALTRIPMADE (обратите внимание, что, поскольку это триггер вставки, запись :OLD либо не будет существовать, либо все равно не будет содержать каких-либо значимых данных). Другая ошибка находится в вашем предложении WHERE, где вы выбираете L# из TRIP, присоединенного к DRIVER, но вы не связываете его обратно с таблицей DRIVER, которую вы пытаетесь обновить. Вместо этого просто обновите DRIVER, где L# равно :NEW значению L# из таблицы отключения. Последняя ошибка, которую я заметил, - это использование вами оператора присваивания :=, который предназначен для кода PL SQL, однако вы используете его в SQL, поэтому просто используйте = без двоеточия:

CREATE OR REPLACE TRIGGER updatetotaltripmade
AFTER INSERT ON trip
FOR EACH ROW
ENABLE

BEGIN
    UPDATE DRIVER 
    SET TOTALTRIPMADE = nvl(TOTALTRIPMADE,0)+1
    WHERE L# = :NEW.L#;
END;
/
0 голосов
/ 05 мая 2020

В вашем коде есть синтаксическая ошибка, из-за которой триггер не компилируется, я изменил триггер, и он должен успешно скомпилироваться с желаемыми результатами. Пожалуйста, проверьте и оставьте отзыв.

Пожалуйста, найдите ниже сценарий для создания таблицы и компиляции триггера,

drop table trip;
create table trip (trip_id number(10),L# varchar2(10));
drop table driver;
create table driver(driver_id number(10),TOTALTRIPMADE number(10),L# varchar2(10));

drop trigger updatetotaltripmade;

CREATE OR REPLACE TRIGGER updatetotaltripmade
AFTER INSERT ON trip
FOR EACH ROW
ENABLE 
DECLARE 

BEGIN

UPDATE DRIVER 
SET TOTALTRIPMADE = nvl(TOTALTRIPMADE,0) + 1
WHERE DRIVER.L# = :new.L#;

END;
/

select * from ALL_OBJECTS where object_type ='TRIGGER';

Ниже приведены результаты тестов, которые я выполнил на https://livesql.oracle.com/apex/ Проблем нет. в коде. Триггер успешно скомпилирован и действителен.

oraclelivesqllink

...