Oracle
 sql >> Datenbank >  >> RDS >> Oracle

auslösen, wenn sonst

Die PL/SQL-Syntax erlaubt es nicht, SQL-Anweisungen in die IF-Klausel aufzunehmen.

Der richtige Ansatz besteht darin, die SELECT-Anweisung herauszutrennen und dann auf ihr Ergebnis zu testen. Das wäre also:

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;

Beachten Sie, dass dies nicht das Vorhandensein mehrerer Zeilen in table2 behandelt den Kriterien entsprechen, oder es gibt tatsächlich keine übereinstimmenden Zeilen. Es handhabt auch keine Sperren.

Denken Sie auch daran, dass Code wie dieser in Umgebungen mit mehreren Benutzern nicht gut funktioniert. Deshalb habe ich das Sperren erwähnt. Sie sollten wirklich prozedurale Logik verwenden, um mit dieser Art von Anforderungen umzugehen. Obwohl, wie es oft bei schlecht durchdachten Triggern der Fall ist, der eigentliche Schuldige ein schlechtes Datenmodell ist. table2.column2 hätte nicht mehr normalisiert werden sollen.