проверить, существуют ли в этой таблице некоторые атрибуты новой строки, которую я буду вставлять, или нет, и если да, сделать что-то по триггеру - PullRequest
0 голосов
/ 13 апреля 2019

Это мой триггер, он должен проверить, существуют ли cargoPolicyNumber, containerNumber в таблице CONTAINER_FEE или нет, если да, тогда будет UPDATE extraFee .. Но когда я запустил его, я столкнулся с сообщением «триггер создан с ошибкой компиляции»

CREATE TRIGGER FEE_VIOLATION 
BEFORE INSERT ON CONTAINER_FEE 
FOR EACH ROW 
BEGIN

IF EXISTS (SELECT cargoPolicyNumber ,containerNumber FROM CONTAINER_FEE WHERE
new.cargoPolicyNumber = cargoPolicyNumber AND new.containerNumber = containerNumber)
   UPDATE CONTAINER_FEE 
   SET extraFee=extraFee+100 
    WHERE new.cargoPolicyNumber = cargoPolicyNumber AND new.containerNumber =
containerNumber; 
END IF 

END

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

Вы получаете сообщения об ошибках, потому что некоторые мелочи отсутствуют:

CREATE OR REPLACE TRIGGER FEE_VIOLATION 
--> add "OR REPLACE" even if this is not a source of the error, you'll need this for future modifications
BEFORE INSERT ON CONTAINER_FEE 
FOR EACH ROW 
BEGIN

IF EXISTS (SELECT cargoPolicyNumber ,containerNumber FROM CONTAINER_FEE WHERE
new.cargoPolicyNumber = cargoPolicyNumber AND new.containerNumber = containerNumber)
THEN --> This is missing(Error)
   UPDATE CONTAINER_FEE 
   SET extraFee=extraFee+100 
    WHERE new.cargoPolicyNumber = cargoPolicyNumber AND new.containerNumber =
containerNumber; 
END IF; --> This semicolon is missing(Error) 

END;
/  --> you need this to compile the programming unit
0 голосов
/ 13 апреля 2019

Вы не можете получить доступ к таблице, которая изменяется в триггере FOR EACH ROW.Но вы, вероятно, изменяете строку, которая в настоящее время вставляется?В этом случае вам не нужен оператор обновления, вы можете просто изменить значение до его вставки.Замените заявление об обновлении на:

:new.extraFee := :new.extraFee + 100;
...