# LOAD DATA INFILE mit Oracle



## Lia (10. Jul 2019)

Hi ihr lieben,

habe da Mal wieder eine Frage xD
Und zwar würde ich gerne Daten in eine CSV laden. Ich habe den Befehl "Load Data INFILE" genutzt aber der funktioniert für Oracle nicht, habe auch schon herausgefunden, dass es hierfir den SQLLoader gibt. Nur weiss ich nicht wie ich es genau in meine Java Datei einbauen soll.

Habe zurzeit 

LOAD DATA INFILE /path/to/file REPLACE INTO TABLE....

Das würde ich gerne so umschreiben das es für die Oracle DB funktioniert.

LG und danke


----------



## Xyz1 (10. Jul 2019)

Lia hat gesagt.:


> Habe zurzeit


Was ist das? Jedenfalls kein Java, so viel seh ich.^^


----------



## mihe7 (11. Jul 2019)

Lia hat gesagt.:


> würde ich gerne Daten in eine CSV laden


Aus einer CSV-Datei laden oder in eine CSV-Datei schreiben? Einmalig, wiederkehrend? Gleichbleibende Struktur/gleiche Tabelle? Auf dem Server oder vom Client aus?


----------



## Lia (11. Jul 2019)

@mihe7 guten Morgen  danke.

Aus einer Csv lesen und in eine Tabelle einlesen. Wiederkehrend. Genau gleiche Struktur und teste erstmal lokal


----------



## Lia (11. Jul 2019)

Habe zur Zeit eine Datei test.sql im Java Projekt eingebunden

LOAD DATA LOCAL INFILE 'test.csv' REPLACE INTO TABLE temp_test...


----------



## mihe7 (11. Jul 2019)

Dazu müsstest Du SQL Loader aufrufen, was voraussetzt, dass dieses Tool (inkl. etwaiger zusätzlicher Abhängigkeiten) auf dem Rechner installiert ist, auf dem die Java-Anwendung läuft. Würde ich nicht machen.

Auch die Funktionen, die die DB selbst anbietet, funktionieren, wenn ich mich recht entsinne, nur mit Dateien, die sich auf dem Server befinden. Würde ich nicht machen.

Besser wäre es, das in Java zu haben. Je nachdem, wie Deine CSV aussieht, hast Du das schnell selbst oder unter Zuhilfenahme einer CSV-Bibliothek erledigt und bist dann weitestgehend von der DB unabhängig.


----------



## Lia (11. Jul 2019)

Vielen Dank für deine Antwort

Was kann ich da für eine Bibliothek nutzen ? Csvloader? Hatte da was gelesen .. oder ist es was anderes ?


----------



## Lia (11. Jul 2019)

So wie hier zb ?








						Import CSV file to MySQL table Java Example
					

Import CSV file to MySQL table Java Example




					examples.javacodegeeks.com
				




Aber er macht das in der Java Applikation ich würde das gerne in meiner .sql Datei haben


----------



## mihe7 (11. Jul 2019)

Wie lädst Du denn die .sql-Datei in die DB?


----------



## Lia (11. Jul 2019)

Zur Zeit Funktioniert es nicht also für die Oracle db, dachte das ginge mit Load Data INFILE..


----------



## Thallius (11. Jul 2019)

Warum nimmst du nicht einfach SQLDeveloper?


----------



## mihe7 (11. Jul 2019)

Lia hat gesagt.:


> Zur Zeit Funktioniert es nicht, dachte das ginge mit Load Data INFILE ? Oder ist es doch nicht das ?


LOAD DATA INFILE ist kein Oracle SQL-Statement, sondern Inhalt eines Control-Files für das externe Tool SQL*Loader.


----------



## Lia (11. Jul 2019)

Ja genau, aber wie kann ich das so umschreiben , dass ich es für eine Oracle DB ausführen kann?


----------



## Xyz1 (11. Jul 2019)

mihe7 hat gesagt.:


> LOAD DATA INFILE ist kein Oracle SQL-Statement, sondern Inhalt eines Control-Files für das externe Tool SQL*Loader.


Super, diese Antwort hätte eigentlich vom TE kommen müssen... Deine Glaskugel scheint besser zu sein als meine.


----------



## Dukel (11. Jul 2019)

Lia hat gesagt.:


> Ja genau, aber wie kann ich das so umschreiben , dass ich es für eine Oracle DB ausführen kann?


Entweder startest du SQL*Loader und übergibst die entsprechenden Parameter oder du nutzt andere SQL Befehle und schickst dies direkt an Oracle. Aber den Befehl so umschreiben wird nicht gehen.









						5 different ways to load flat file into Oracle table
					

We need to move data from flat file to Oracle table frequently. For example sales department sends daily sale data in excel sheet to IT department, how this data feed into Oracle database (to table…




					sqlandplsql.com


----------



## Lia (12. Jul 2019)

@Dukel vielen Dank für deine Antwort. Dieser Load data INFILE Befehl steht bei mir in einer ctl File. Ich wollte alles in eine .sql Datei packen aber da es mit dem Load data INFILE fur die oracle nicht funktioniert. Geht es nicht.. dh muss ich diese File über einen process builder aüsfuhren ? Oder wie genau ? Habe auch etwas über sqlcl gelesen ginge es auch mit sowas ? Sorry wirklich für solche Fragen


----------



## Dukel (12. Jul 2019)

Wie gesagt, es gibt mehrere Möglichkeiten. Wenn du das ganze mit dem SQL*Loader machen willst musst du diesen starten (mit Process Builder), bedingt aber, dass der installiert ist.
Wenn du es mit SQL Mitteln machen willst, dann wie in dem Link beschrieben z.B. mit den Temporären Tabellen.
SQLCL ist, wenn ich das richtig gegoggelt habe, ein CLI Tool um SQL Befehle und Scripte an Oracle zu schicken, das geht aber auch mit Java selbst (JDBC) und du bist nicht von dem Tool abhängig.


----------



## Lia (12. Jul 2019)

Vielen Dank !

Also habe halt eine .sh Datei in dieser sh datei werden halt 4 Befehle aufgerufen 3 davon sind .sql Dateien und eine .ctl .. ich wollte es halt nicht mehr über einen process builder machen also keine shell Scripte mehr aufrufen , sondern direkt über Java.. die sql Dateien sind ja kein Problem mir diese ctl File


----------



## Dukel (12. Jul 2019)

Dann musst du das selber implementieren. Entweder die CSV als SQL Datei (in lauter Inserts) umschreiben (z.B. mit Java) oder mit den externen Tabellen.


----------



## Lia (12. Jul 2019)

Du meinst das :

LOAD DATA INFILE test.csv
REPLACE INTO TABLE temp_test
FIELDS TERMINATED BY ',' OPTIONALLY BY '"'
TRAILING NULLCOLS (TEST_ID, TEST_NAME)

Habe das in der ctl File.. das umschreiben ??


----------



## mihe7 (12. Jul 2019)

"Umschreiben" ist der falsche Ausdruck. Du musst die Funktionalität selbst in Java implementieren. Dazu besorgst Du Dir am besten eine Bibliothek, mit der Du einfach CSV-Dateien einlesen kannst und dann schreibst Du einfach entsprechende INSERT-Statements (JDBC).


----------



## Lia (12. Jul 2019)

Ok Alles klar  aber was mache ich mit den anderen befehlen wie das TRAILING NULLCOLS oder das mit dem REPLACE INTO TEMP_TESTTBL..


----------



## mihe7 (12. Jul 2019)

TRAILING NULLCOLS sorgt ja nur dafür, dass eine CSV-Datei gelesen werden kann, bei der wenigstens zwei Datensätze eine unterschiedliche Anzahl an Spalten haben. Wenn Du also eine CSV-Datei 

```
header1,header2,header3
1,2,3
4,5
6,7,
8,9,10
```
hast, dann wird die Datei eingelesen und die fehlenden Werte (nach 4,5 und 6,7) durch NULL ersetzt. 

Das wäre Aufgabe der CSV-Lib. 

Und REPLACE INTO kannst Du nachbilden, indem Du z. B. die betreffende Zeile vor dem Einlesen löschst.


----------



## Thallius (12. Jul 2019)

mihe7 hat gesagt.:


> Und REPLACE INTO kannst Du nachbilden, indem Du z. B. die betreffende Zeile vor dem Einlesen löschst.



Naja, da würde ich dann aber MERGE und MATCH vorziehen

Gruß

Claus


----------



## mihe7 (12. Jul 2019)

Thallius hat gesagt.:


> Naja, da würde ich dann aber MERGE und MATCH vorziehen


Oha, das gibts ja auch schon einige Zeit... Ich sollte mir wieder mal SQL reinziehen, da hat sich ja einiges getan.


----------

