.csv nach Oracle

Hallo,

erstmal ein frohes neues Jahr an alle.
Ich bins mal wieder und habe eine Frage, oder mehrere :wink:
Ich habe eine .csv Datei die ich gerne in eine Oracle Tabelle einpflegen möchte. Habe mich schon an UTL_FILE probiert, aber ich weiß nicht warum, ich bekomme es nicht hin. Gibt es noch andere Befehle zum einlesen solcher Dateien, und wie sage ich ihm wo er das hinschreiben soll? Arbeite mit dem SQL Navigator, oder dem SQL+ Worksheet von Oracle. Wäre schön wenn mir jemand Tipps geben könnte.

Vielen Dank im voraus…

hi!

kurz und bündig: sql-loader; du benötigst lediglich noch ein control-file, daß bestimmt, in welche tabelle welche werte in welcher form mit welchen trennzeichen aus welchem file reingeschrieben werden

grüße,
tomh

ps: bei utl-file brauchst du natürlich die berechtigungen für das verzeichnis und die datei, von/aus der du liest/schreibst

Hallo,

erstmal ein frohes neues Jahr an alle.

Ebenso :smile:

Ich habe eine .csv Datei die ich gerne in eine Oracle Tabelle
einpflegen möchte.

Es gibt (ich glaube seit Version 8i) die Möglichkeit, sog.
Externe Tabellen anzulegen (external tables). Unten poste
ich Dir ein Beispiel dazu. Du kannst auf so einen external
table selektieren, nicht jedoch insert/update/delete oder
Indizes anlegen. Aber es geht ja nur darum, die Daten in die
Datenbank zu bekommen, dafür ist ein externer table gerade
das Richtige.

Habe mich schon an UTL_FILE probiert, aber
ich weiß nicht warum, ich bekomme es nicht hin.

Dazu auch ein Hinweis, den ich selbst schon oft vergessen habe:
Verzeichnisse, auf die Du mit utl_file-Prozeduren zugreifen
willst, müssen als Parameter UTL_FILE_DIR definiert sein.
Nur auf die so definierten kannst Du lesend und schreibend
per utl_file zugreifen. Welche bei Dir definiert sind, findest
Du mit folgendem Befehl in SQLPlus heraus (als system ausführen):
SHOW PARAMETER UTL

Und nun das Beispiel fuer external tables. Im Beispiel ist
der Feldtrenner das |-Zeichen. Wenn Du ein anderes verwendest,
zum Beispiel das Semikolon, musst Du beim create table-statement
dieses entsprechend ändern (Zeile FIELDS TERMINATED BY…)
Viel Erfolg!

Gruss,
Ralf

Lese-Zugriff auf eine im Filesystem abgelegte CSV-Datei

Schritt 1:
create or replace Directory MEINDIRECTORY as ‚/var/tmp‘;
(muss ein gültiges Unix-Verzeichnis sein, welches auch über
UTL_FILE_DIR erreichbar ist)

Schritt 2:
CREATE TABLE Tabellenname
( )
ORGANIZATION external (
TYPE oracle_loader
DEFAULT DIRECTORY MEINDIRECTORY
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
CHARACTERSET
– BADFILE log_file_dir:‚sh_sales.bad_xt‘
– LOGFILE log_file_dir:‚sh_sales.log_xt‘
FIELDS TERMINATED BY „|“
OPTIONALLY ENCLOSED BY ‚"‘ AND ‚"‘
LDRTRIM
)
LOCATION (’’)
)
REJECT LIMIT UNLIMITED;

Beispiel:

In UTL_FILE_DIR ist /var/tmp enthalten.

Datei anlegen: „/var/tmp/demo.csv“ mit folgendem Inhalt:
1|eins
2|„zwei“
3|drei
4|vier
5|„Fünf“

SQLPlus:

CREATE OR REPLACE DIRECTORY Demo AS ‚/var/tmp‘;

CREATE TABLE Demo
( ID NUMBER,
NAME VARCHAR2(20) )
ORGANIZATION external (
TYPE oracle_loader
DEFAULT DIRECTORY Demo
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
CHARACTERSET WE8ISO8859P1
FIELDS TERMINATED BY „|“
OPTIONALLY ENCLOSED BY ‚"‘ AND ‚"‘
LDRTRIM
)
LOCATION (‚demo.csv‘)
)
REJECT LIMIT UNLIMITED;

SELECT * FROM Demo WHERE ID >= 3;

ID NAME


3 drei
4 vier
5 Fünf