De PL/SQL-syntaxis staat het niet toe om SQL-instructies in de IF-clausule op te nemen.
De juiste aanpak is om de SELECT-instructie te scheiden en vervolgens te testen op het resultaat. Dus dat zou zijn:
create or replace trigger trig1
after insert on table_1
for each row
declare
v table2.column2%type;
begin
select table2.column2
into v
from table2
where table2.id= :new.id;
if v is null
then
update table2
set table2.column2 = :new.column1
where table2.id = :new.id;
end if;
end trig1;
Merk op dat dit het bestaan van meerdere rijen in table2
niet behandelt overeenkomen met de criteria, of er zijn inderdaad geen overeenkomende rijen. Het kan ook niet worden vergrendeld.
Houd er ook rekening mee dat dergelijke code niet goed werkt in omgevingen met meerdere gebruikers. Daarom noemde ik vergrendeling. Je zou procedurele logica moeten gebruiken om aan dit soort vereisten te voldoen. Hoewel, zoals vaak het geval is met ondoordachte triggers, de echte boosdoener een slecht datamodel is. table2.column2
had moeten verdwijnen.