Как предлагается в комментариях, вы должны сделать это в хранимой процедуре, которая может выглядеть примерно так:
create or replace procedure prc_ActivateThingy(p_Id number) as
begin
update YourThingy t
set t.Active = 'Y'
where
t.Id = p_Id;
dbms_output.put_line(sql%rowcount);
if sql%rowcount = 0 then
raise_application_error(-20000, 'No thingy found with id ' || p_Id || '.');
end if;
update YourThingy t
set t.Active = 'N'
where t.Id <> p_Id;
dbms_output.put_line(sql%rowcount);
end;
Выполнение этого в триггере также будет работать, но в конечном итоге ваше приложение станет трудно поддерживать, если слишком много «магии триггера». Когда будет сложнее предугадать, что произойдет, и вы можете оказаться в запутанном беспорядке, затрудняющем реализацию новой бизнес-логики или технических рефакторингов.
Итак, для полноты, это как сделать это в составном триггере, хотя опять же, рекомендуется выбрать опцию выше.
create or replace trigger tiuc_YourThingy
for insert or update on YourThingy
compound trigger
v_Id number;
before each row is
begin
v_Id := null;
if :new.Active = 'Y' then
v_Id := :new.Id;
end if;
end before each row;
after statement is
begin
if v_Id is not null then
update YourThingy t
set
t.ACTIVE = 'N'
where
t.ID <> v_Id;
end if;
end after statement;
end;