sql >> Databáze >  >> RDS >> Oracle

spoušť, pokud jinak

Syntaxe PL/SQL neumožňuje zahrnutí příkazů SQL do klauzule IF.

Správný přístup je oddělit příkaz SELECT a poté otestovat jeho výsledek. Takže by to bylo:

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;

Všimněte si, že to nezpracovává existenci více řádků v table2 vyhovující kritériím nebo ve skutečnosti neexistují žádné odpovídající řádky. Také nezvládá zamykání.

Mějte také na paměti, že kód jako tento nefunguje dobře v prostředí s více uživateli. Proto jsem zmínil zamykání. Měli byste opravdu používat procedurální logiku, abyste zvládli tyto druhy požadavků. I když, jak už to u nedomyšlených spouštěčů bývá, skutečným viníkem je špatný datový model. table2.column2 měla být normalizována.




  1. Nejbližší zápas, část 2

  2. Jak nastavit proměnnou prostředí PYTHON_EGG_CACHE na Macu?

  3. Problém s generováním PHP PDF

  4. Tabulka filtrů ADF na základě výběru stromu