Oracle
 sql >> Base de données >  >> RDS >> Oracle

déclencher sinon

La syntaxe PL/SQL ne permet pas d'inclure des instructions SQL dans la clause IF.

L'approche correcte consiste à séparer l'instruction SELECT, puis à tester son résultat. Ce serait donc :

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;

Notez que cela ne gère pas l'existence de plusieurs lignes dans table2 correspondant aux critères, ou bien s'il n'y a pas de lignes correspondantes. Il ne gère pas non plus le verrouillage.

Gardez également à l'esprit qu'un code comme celui-ci ne fonctionne pas bien dans les environnements multi-utilisateurs. C'est pourquoi j'ai mentionné le verrouillage. Vous devriez vraiment utiliser la logique procédurale pour gérer ce genre d'exigences. Bien que, comme c'est souvent le cas avec des déclencheurs mal conçus, le véritable coupable est un modèle de données médiocre. table2.column2 aurait dû être normalisé hors de l'existence.