INSERT bzw UPDATE bei Oracle

Hallo,

ich möchte in eine Tabelle regelmäßig per Perl-Skript Daten schreiben die ich per CSV Datei erhalte (ca 50.000 Datensätze pro Tag). Bei den Daten kann es vorkommen, dass sie der Primär Schlüssel schon in der tabelle vorhanden ist.

Falls ein schon vorhandener Primär Schlüssel auftaucht, sollte ein Update gemacht werden, falls es den Primär Schlüssel noch nicht gibt ein Insert.

Gibt es eine elegantere/schnellere Lösung, als vor jedem Datensatz mit einem Select nachzusehen, ob der Datensatz schon existiert?

Es sollte möglichst schnell ablaufen.

Ich könnte natürlich auch erst ein Delete über alle Datensätze machen, deren Primär Schlüssel in der CSV Datei vorkommt. Dann die Inserts und zum Schluß das commit.

Was meint Ihr?

Gruß
Till

Hallo,
versuchs mal mit Merge,
hier eine kleine Erklärung dazu http://www.psoug.org/reference/merge.html
geht aber soviel ich weiß erst ab Oracle 9

Hi!

Wie schon gesagt mit MERGE, oder Du versucht ganz einfach mal ein UPDATE und wenn SQL%ROWS (keine Schläge bitte, ich weiß den Namen nimmer auswendig, aber irgendwie so ähnlich) 0 (Anzahl der upgedateten Records) zurückliefert machst Du ein INSERT …

Grüße,
Tomh

Hallo,

  • Merge, wie schon erwähnt,
    oder:
  • Temporäre Tabelle anlegen, diese füllen
  • INSERT in Zieltabelle mit Subselect (Primärschlüssel nicht vorhanden)
  • Update Zieltabelle mit Subselect (Primärschlüssel vorhanden)
  • Temporäre Tabelle leeren
    oder:
  • Temporäre Tabelle anlegen, diese füllen
  • Cursor mit SELECT über Temp-Tabelle und Zieltabelle für Sätze mit vorhandenem PK, diese Updaten
  • Cursor mit SELECT über Temp-Tabelle und Zieltabelle, Sätze mit nicht vorhandenem PK, diese INSERTen
  • Temporäre Tabelle leeren
    So in etwa…

Gruß, muzel

Hallo Till,

du hast ja schon mehrere Vorschläge bekommen. Einen hätte ich auch noch:

BEGIN
 INSERT ...
EXCEPTION WHEN DUP\_VAL\_ON\_INDEX THEN
 UPDATE ...
END;
/
COMMIT;

Ist abgesehen von MERGE vermutlich das schnellste, weil nur die unbedingt notwendigen Operationen ausgeführt werden. Wenn’s dir um Performance geht würde ich übrigens zumindest alle non-unique Indices ausschalten und danach wieder einschalten. Den Primary Key musst du bei der obigen Variante natürlich laufen lassen, sonst kommst du a) nie in die Exception und hättest b) einen recht langsamen Update (full table scan) wenn du hinkämst…

Gruß
Martin

Vielen Dank an alle die mir geantwortet haben!
Ich habe das Problem jetzt mit Merge gelöst.

Gruß
Till