Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

acionar se mais


A sintaxe PL/SQL não permite incluir instruções SQL na cláusula IF.

A abordagem correta é separar a instrução SELECT e depois testar seu resultado. Então isso seria:
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;

Observe que isso não lida com a existência de várias linhas em table2 correspondendo aos critérios ou, de fato, não havendo linhas correspondentes. Também não suporta travamento.

Além disso, lembre-se de que um código como esse não funciona bem em ambientes multiusuário. É por isso que eu mencionei bloqueio. Você realmente deveria usar lógica procedural para lidar com esses tipos de requisitos. Embora, como costuma ser o caso de gatilhos mal concebidos, o verdadeiro culpado é um modelo de dados ruim. table2.column2 deveria ter sido normalizado fora da existência.