sql >> Database >  >> RDS >> Oracle

trigger als anders

De PL/SQL-syntaxis staat het niet toe om SQL-instructies in de IF-clausule op te nemen.

De juiste aanpak is om de SELECT-instructie te scheiden en vervolgens te testen op het resultaat. Dus dat zou zijn:

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;

Merk op dat dit het bestaan ​​van meerdere rijen in table2 niet behandelt overeenkomen met de criteria, of er zijn inderdaad geen overeenkomende rijen. Het kan ook niet worden vergrendeld.

Houd er ook rekening mee dat dergelijke code niet goed werkt in omgevingen met meerdere gebruikers. Daarom noemde ik vergrendeling. Je zou procedurele logica moeten gebruiken om aan dit soort vereisten te voldoen. Hoewel, zoals vaak het geval is met ondoordachte triggers, de echte boosdoener een slecht datamodel is. table2.column2 had moeten verdwijnen.




  1. Voer php-code voorwaardelijk uit

  2. STRING_SPLIT in MySql - hoe doe je dat?

  3. Hoe LocalTime op te slaan in de slaapstand

  4. Enity Framework met MySQL