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

У меня есть эта таблица, которую я хочу сделать перед триггером вставки

, который проверит, имеет ли новое вставленное значение значение NULL в столбце A, затем он вставит 0 в столбец B +, установит selected_On с sysdate

Это мой желаемый вывод

COLUMN_A COLUMN_B CREATED_BY UPDATE_BY
  null     0       sysdate   sysdate
  12       1       sysdate   sysdate

А это мой триггер

CREATE OR REPLACE TRIGGER SCH.TABLEA_TRG BEFORE 
 INSERT or update
 ON SCH.TABLEA REFERENCING OLD AS old NEW AS new
FOR EACH ROW
begin
if inserting then
:NEW.CREATED_ON := sysdate ;
:NEW.UPDATED_ON := sysdate ;
if :COLUMN_A  is null
 then set :new.COLUMN_B 0
else  :COLUMN_A  is not null
then set :new.COLUMN_B 1 
elsif updating then
:NEW.UPDATED_ON := sysdate ;
end if;

end;

но он имеет синтаксическую ошибку и не может понять это

1 Ответ

4 голосов
/ 19 июня 2019

Было несколько ошибок - пропущено: NEW перед некоторыми переменными связывания, пропадет end, если нет команды "set", неверное имя столбца.Это, похоже, компилируется.

CREATE OR REPLACE TRIGGER tablea_trg BEFORE
    INSERT OR UPDATE ON tablea
    REFERENCING
            OLD AS old
            NEW AS new
    FOR EACH ROW
BEGIN
    IF inserting THEN
        :new.created_on := SYSDATE;
        :new.updated_on := SYSDATE;
        IF :new.column_a IS NULL THEN
            :new.column_b := 0;
        ELSE
            IF :new.column_a IS NOT NULL THEN
                :new.column_b := 1;
            END IF;
        END IF;

    ELSIF updating THEN
        :new.updated_on := SYSDATE;
    END IF;
END;

Как бы скучно это ни было, справка Oracle *1005* всегда является хорошим справочником.

...