Oracle
 sql >> Database >  >> RDS >> Oracle

innescare se altro

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.