#sql #oracle #plsql #database-trigger
#sql #Oracle #plsql #database-триггер
Вопрос:
Мне нужно создать триггер в таблице, который обновляет при каждой вставке значение столбца, если присутствует условие. Итак, в таблице, подобной этой:
Мне нужен триггер для обновления всех нулевых значений до ‘1’, если «RegimeIva» = ‘3’, чтобы получить такой результат:
Я пытался:
create or replace TRIGGER AtualizaNat before INSERT ON Cabecdoc
for each row
BEGIN
if :new.IntrastatnatA is null and :new.intrastatnatB is null and :new.regimeiva = '3' then
:new.intrastatnatA : 1; :new.intrastatnatB : 1;
else
:new.intrastatnatA : null; :new.intrastatnatB : null;
end if;
END;
Это не работает
Комментарии:
1.
= is null
должно бытьis null
и:= is null;
должно быть изменено на:= null;
2. Да, моя ошибка! но это все равно не работает.
3. Вы хотите обновить только одну вставляемую строку? Если да, то что именно не работает?
4. Присвоение значения должно происходить с помощью := и не только : поэтому оно должно быть:new.intrastatnatA := 1; вместо :new.intrastatnatA : 1;
5. Да, вставляется только одна строка. «Сообщение 156, уровень 15, состояние 1, строка 1 с неправильным синтаксисом рядом с ключевым словом «или».
Ответ №1:
Исправлено несколько синтаксических ошибок в вашем коде.
Вот небольшой пример. У меня это работает нормально:
create table Cabecdoc (IntrastatnatA number, IntrastatnatB number, regimeiva char(1));
create or replace TRIGGER AtualizaNat before INSERT ON Cabecdoc
for each row
BEGIN
if :new.IntrastatnatA is null and :new.intrastatnatB is null and :new.regimeiva = '3' then
:new.intrastatnatA := 1; :new.intrastatnatB := 1;
else
:new.intrastatnatA := null; :new.intrastatnatB := null;
end if;
END;
--inserting a row...
insert into Cabecdoc values (null, null, '3');
--...and checking
select * from Cabecdoc;
--Output:
IntrastatnatA IntrastatnatB regimeiva
1 1 3