sql >> Databasteknik >  >> RDS >> Oracle

utlösa om annat

PL/SQL-syntaxen tillåter inte att inkludera SQL-satser i IF-satsen.

Den korrekta metoden är att separera SELECT-satsen och sedan testa för dess resultat. Så det skulle vara:

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;

Observera att detta inte hanterar förekomsten av flera rader i table2 matchar kriterierna, eller så finns det inga matchande rader. Den klarar inte heller låsning.

Tänk också på att kod som denna inte fungerar bra i fleranvändarmiljöer. Det var därför jag nämnde låsning. Du borde verkligen använda procedurlogik för att hantera den här typen av krav. Även om som ofta är fallet med ogenomtänkta triggers är den verkliga boven en dålig datamodell. table2.column2 borde ha normaliserats ur existens.




  1. Mysql välj för uppdatering - det låser inte målraderna. Hur ser jag till att det gör det?

  2. MYSQL LEFT JOIN MED GROUP BY

  3. Finns det MySQL som motsvarar Oracles TIMESTAMP WITH TIME ZONE?

  4. Integration med ett annat system