# Insert oder Update- Prüfung



## edshirt (5. Jan 2010)

Hallo,

ich habe ein PL/SQL-Frage:
Ich möchte innerhalb eines Triggers überprüfen ob in einer Tabelle bereits ein Eintrag existiert. Wenn der Eintrag bereits vorhanden ist soll ein Update ausgeführt werden, ansonsten soll ein Insert erfolgen.
Wie kann ich in dem IF-Teil überprüfen ob bereits der gesuchte Eintrag existiert?

```
CREATE OR REPLACE TRIGGER trig_Paletten_insert AFTER
  INSERT ON paletten FOR EACH row BEGIN 
IF
    (
      -- Hier muss dann geschaut werden ob der Eintrag in der Tabelle anzPaletten exisiert.
    )
THEN
  UPDATE anzPaletten
  SET anzPaletten           = anzPaletten - 1
  WHERE anzPaletten.lagerid = :new.lagerID
  AND anzPaletten.warenid   = :new.warenid;
ELSE
  INSERT
  INTO anzPaletten
    (
      lagerid,
      warenid
    )
    VALUES
    (
      :new.lagerid,
      :new.warenid
    );
END IF;
END;
/
```

PS: Ich verwende Oracle.


----------



## Michael... (5. Jan 2010)

Muss es denn über einen Trigger sein?
Einfacher wäre doch im Programm ein Update auszuführen und auf Erfolg zu prüfen. Bei Misserfolg wird dann ein Insert gemacht:

```
int result = stmt.executeUpate(Hier das Update Statement);
if (result == 0)
    stmt.executeUpdate(Hier das Insert Statement);
```
Würde Trigger und Hilfstabelle sparen.

Mit Trigger könnte man z.B. so vorgehen

```
...
DECLARE
    v_counter number;
BEGIN
    Select count(paletten.*) Into v_counter From paletten, anzpaletten Where paletten.ID = anzpaletten.ID;
    
    IF (number >= 1)
...
```

Wobei das ganze einfach mal so hingeschrieben ist bzgl. PL Syntax bin ich mir nicht so sicher - ist schon ein bisschen her.


----------



## bronks (5. Jan 2010)

Je nach Ziel die einfachste Art: 
1. Update abfeuern, da es diesem egal ist, ob ein Datensatz vorhanden ist.
2. Insert abfeuern, welches meckert, wenn der Satzvorhanden ist, was eigenltich egal ist, da in dem Fall das Update bereits seinen Job gemacht hat.

Ein extra Select zum prüfen kostet mehr als ein Update ins leere bzw. ein Insert, welches auf die Nase fliegt.


----------



## edshirt (5. Jan 2010)

Ich habe es jetzt in einer Variante von Michales Vorschlag gelöst. Das Insert wird jetzt ausgeführt, wenn bei dem Select eine NO_DATA_FOUND-Exception geworfen wird. Na ja bestimmt keine sehr elegante Lösung, aber sie läuft.

Danke für die Hilfe.


----------

