Der SQL*Loader

Hallo!

Ich habe folgendes Problem:

Ich möchte Daten mit dem SQL*Loader von einer .txt-Datei in eine Tabelle laden. Dieses .txt-File wird voraussichtlich täglich bei mir ankommen, woraufhin es in die Tabelle geladen wird.
Die Daten aus diesem File zu laden klappt bereits wunderbar, jedoch kommen in Zukunft nicht nur neue sondern auch aktualisierte Datensätze!
Da nun Daten geladen werden, die einen bereits verwendeten Primärschlüssel haben, kommt es natürlich zu einer Unique constraint verletzung.
Weiß jemand wie ich dem Loader sagen kann, er soll die doppelten Primärschlüssel einfach nur überschreiben? Vielleicht einfach durch einen Eintrag im controlfile?

Noch zur Ansicht, mein Controlfile sieht folgendermaßen aus:

LOAD DATA
INFILE '\\Dateipfad\Dateiname.txt'
APPEND
INTO TABLE TIVOLI\_INVENTORY
FIELDS TERMINATED BY ";"
TRAILING NULLCOLS
(DATE1, DATE2, usw.)

Im Voraus schonmal vielen Dank für eure Hilfe!

Florian

Hallo,

ich würde folgendes Vorgehen wählen :

  1. Mit SQL Loader in eine Staging Tabelle laden, welche vorher immer hellert wird).
  2. Aus dieser Staging Tabelle anschliessen mit dem SQL MERGE Befehl in die eigentliche Zieltabelle schreiben. MERGE behandelt exakt die Problematik des Insert/Updates.

Gruss

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Okay, das leuchtet ein. Aber kann man diesen MERGE-Befehl auch direkt in das Control-File schreiben?
Ich will daraus am Ende nämlich eine .bat-Datei machen um diesen Prozess automatisch ablaufen zu lassen.
Wenn das geht, kannst du mir einen Hinweis geben wo genau ich den Befehl setzen muss? - Ich bin noch ziemlich neu auf diesem Gebiet.

Danke schonmal!

Florian

wie siehts denn aus mit
http://dev.mysql.com/doc/refman/4.1/en/replace.html

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Mein PHPadmin schmiesst sowas raus bei gleichen keys

LOAD DATA LOCAL INFILE ‚/tmp/phpbFODff‘ REPLACE INTO TABLE Session
FIELDS TERMINATED BY ‚;‘
ENCLOSED BY ‚"‘
ESCAPED BY ‚\‘
LINES TERMINATED BY ‚\r\n‘

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

  • Du kannst auch eine EXTERNAL Table benutzen. Sobald du diese definiert hast, kannst du sie mittels SQL in deine Zieltabelle mergen. Wenn du dass automatiesieren willst, bietet sich dafür ein PL/SQL Packageund der JOB Manager an. Anbei ein Beispiel, wie es mit einer external Table funktioniern würde :

MERGE INTO newemp n1
USING external_table e1
ON ( n1.empno = e1.empno )
WHEN MATCHED THEN UPDATE
SET – n1.empno = e1.empno,
n1.ename = e1.ename,
n1.job = e1.job,
n1.mgr = e1.mgr,
n1.hiredate = e1.hiredate,
n1.sal = e1.sal,
n1.comm = e1.comm,
n1.deptno = e1.deptno
WHEN NOT MATCHED THEN
INSERT ( empno, ename, job, mgr, hiredate, sal, comm, deptno )
values ( e1.empno,
e1.ename,
e1.job,
e1.mgr,
e1.hiredate,
e1.sal,
e1.comm,
e1.deptno )
/

Gruss

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Okay! Vielen Dank für eure Unterstützung. Habs jetzt hinbekommen. Ich bin wie gesagt neu in diesem Gebiet und hab den ganzen Tag gebraucht um mich in diese Syntax einzulesen.
Jetzt muss ich die ganze Befehlsabfolge nur noch in eine Batch-Datei packen.
Vielleicht muss ich mich da auch nochmal durchfragen. :stuck_out_tongue:
Danke Leute!

Grüße
Florian