La sintassi PL/SQL non consente di includere istruzioni SQL nella clausola IF.
L'approccio corretto consiste nel separare l'istruzione SELECT e quindi verificarne il risultato. Quindi sarebbe:
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;
Nota che questo non gestisce l'esistenza di più righe in table2
che corrispondono ai criteri, o addirittura che non ci sono righe corrispondenti. Inoltre non gestisce il blocco.
Inoltre, tieni presente che un codice come questo non funziona bene in ambienti multiutente. Ecco perché ho menzionato il blocco. Dovresti davvero usare la logica procedurale per gestire questo tipo di requisiti. Sebbene, come spesso accade con trigger mal concepiti, il vero colpevole è un modello di dati scadente. table2.column2
avrebbe dovuto essere normalizzato fuori dall'esistenza.