Script zum Import von einer CSV Datei in OraDB Tab

Hallo ich habe ein Problem,
ich möchte aus einer CSV Datei automatisiert Daten in eine Oracle Datenbank Tabelle importieren.

Die Tabelle sap_map_temp hat zwei Spalten (Subject und Item_id) und hat keinen Inhalt bislang nun sollen Werte aus einer CSV Datei in der Form importiert und eingefügt werden:

Subject;Item_id
test;1234
test2;4567

Kann man das mit PL SQL realisieren?

Liebe Grüße & Dank im Voraus

Ecki

Hallo Ecki,

du musst die CSV-Datei als Externe Tabelle registrieren, im Vorfeld brauchst Du dafür ein externes Verzeichnis…

CREATE OR REPLACE DIRECTORY xtern_verzeichnis AS ‚c:\verzeichnis‘;

GRANT read,write ON DIRECTORY xtern_verzeichnis TO username;

und dann

CREATE TABLE sap_map_table(
subject VARCHAR2(20),
item_id Number
)
organization external (
type oracle_loader
default directory xtern_verzeichnis
ACCESS PARAMETERS (
records delimited by newline
FIELDS TERMINATED BY „,“
OPTIONALLY ENCLOSED BY ‚"‘
MISSING FIELD VALUES ARE NULL
)
location(‚dateiname‘)
);

ich stecke da auch nicht mehr so drin, aber so funktioniert es, zahlreiche Optionen hast Du natürlich auch noch für die externe Tabelle… Wenn Du jetzt Änderungen vornehmen willst, eine andere Datei z.B. laden willst, kannst Du das dann über PLSQL manipulieren oder Du greifst mit Cursorn drauf zu oder einfach mit einem SELECT…

ich hoffe ich konnte Dir ein bisschen helfen,

Gruß Chris

Hierfür gibt es verschiedenste Möglichkeiten (auch per PL/SQL):

  1. Mittels „Externer Tabelle“ (Tabelle wird in Datenbank mit Verweis auf Datei erstellt)
  2. Mittels SQL-Loader
  3. Mittels eigener Funktion per PL/SQL mittels UTL_FILE-Package o.ä.

Schau mal hier http://arjudba.blogspot.com/2009/02/how-to-readwrite… vorbei

Grüße,
Tomh

Hallo Ecki,

leider kann ich dir bei diesem Problem nicht helfen,
da ich selbst noch nicht versucht haben mit PL/SQl eine csv-Datei einzulesen.

Sorry.

Viele Grüße

Hallo,

Was löst den automatischen Ablauf aus?
So generell würde ich eine CSV-Datei z.B. mit einem Perl-Skript in die Datenbank schieben.
Bei einer PL/SQL Funktion müssen die Daten auf dem Server liegen. Dateien mit Oracle zu bearbeiten finde ich nicht optimal.

Gruß
Markus

eine Möglichkeit wäre mit dem sqlLoader das ganze zu machen
andere Möglichkeit per text_io auf DB Seite eine Procedure schreiben die die Informationen einlesen.

Hallo ich habe ein Problem,
ich möchte aus einer CSV Datei automatisiert Daten in eine
Oracle Datenbank Tabelle importieren.

Kann man das mit PL SQL realisieren?

Hallo Ecki,

ich habe das mittels UTL_FILE gelöst:

file1_id_ := UTL_FILE.FOPEN(path_, file1_,‚r‘);
LOOP
BEGIN
UTL_FILE.GET_LINE(file1_id_, inrec_);
EXCEPTION WHEN NO_DATA_FOUND THEN
EXIT;
END;

aus dem Satz „inrec_“ die Tabelle mittels INSERT INTO schreiben.

siehe dazu auch:
http://download.oracle.com/docs/cd/B28359_01/appdev…

Gruß Micha

Hallo Ecki,

da gibt es viele Möglichkeiten, PL/SQL geht, ist aber ziemlich kompliziert.
Die erste Frage ist: Wie oft muss importiert werden und muss das weitgehend automatisiert werden.
Am einfachsten für ein einmaliges importieren ist der SQLDevelopper. Da kann man Excel-Daten direkt importieren.
Wenn Du es öfters machen musst, würde ich über externe Tabellen gehen. Wenn Du das richtig machst, kannst Du über normales SQL auf die Excel-Daten zugreifen. Im Web gibt es viele Anleitungen. Nach ‚oracle external table‘ suchen.
Man kann natürlich auch über das Package utl_file auf die Datei zugreifen und die Daten in PL/SQL aus der Datei holen und dann weiter verarbeiten.
Für externe Tabellen und für utl_file müssen die Daten auf den Datenbank-Server in einem für Oracle zugänglich gemachten Directory stehen.

Viele Grüße

Wolfgang

Am einfachsten ist das Einbinden der externen Daten als sogenannte Externe Tabelle. Hierfür müssen die Daten in einem Verzeichnis liegen für das ein Oracle Directory angelegt wurde.
Suche einfach bei Oracle nach dem Schlagwort ‚Externe Tabelle‘. Wenn Du nicht weiterkommst einfach nochmal nachfragen. Vielleicht kann ich morgen ein Beispiel posten.
Ansonsten bliebe Dir nur der Weg über das UTL-File-Package. Hier wird dann Zeile für Zeile ausgelesen. Die Daten müssen auch hier in einem Oracle Directory liegen. Wichtig ist dabei, dass Du auch die entsprechenden Rechte besitzt.

Grüße,
Harry

Hallo,

ja das geht. am Besten mit substr und instr arbeiten und die einzelnen spalten ausschneiden. Danach mit einem Insert in die Datenbank einfügen!

Wobei am Besten ein anderes Programm die Datei liest und je Zeile dein PL/SQL Programm ausführt. Für das lesen einer Datei benötigst du in Oracle die Leserechte auf das Verzeichnis am Server und das ist meistens nicht vorhanden!

Schöne Grüße

Werner Klocker

Hallo it-ecki,
da kann ich momentan leider nicht weiterhelfen.
Gruß Michael

Wenn die Daten regelmäßig gebraucht und aktualiesiert werden sollen würde ich eine Externe Tabelle vorschlagen. Mittels dieser kannst du dann per Select auf die Daten zugreifen und diese dann entsprechend weiter bearbeiten… Ansonsten habe ich (da es etwas aufwändiger ist das zu beschrieben) hier mal einen Link für dich
http://sql-plsql-de.blogspot.com/2007/11/csv-dateien…

Hallo Ecki,

wenn man Excel hat kommt man auch ohne PL/SQL aus.
Man lädt die Datei in Excel und generiert sich zu jedem Datensatz einen entsprechenden Insert-Befehl für die Oracle-Tabelle.
Beispiel:
Die Excel-Tabelle liegt in der Form vor:

A B
1 Subject Item_id
2 test 1234
3 test2 4657

In Spalte C2 wird folgender Befehl eingetragen:
=VERKETTEN(„insert into sap_map_temp values(“;A2;",’";B2;"’);")

Anschließend wird der Inhalt von Spalte C2 in alle darunterliegenden Zeilen kopiert, die in den Spalten A und B Daten enthalten (also in C3,C4,C5,…).

Dann werden alle Insert-Befehle aus der Spalte C kopiert und in eine txt.Datei geschrieben (z.B. Daten.sql).
Anschließend wird diese Datei mit SQL+ ausgeführt:
start c:\temp\Daten.sql

Alternativ (wenn es nicht allzuviele Daten sind) kann der Inhalt der Spalte C direkt in SQL+ kopiert werden. Die Befehle werden dann automatisch ausgeführt.
Am Ende commit nicht vergessen.

Wenn es ohne Excel funktionieren soll, dann bitte Rückmeldung.

Lorenz

Hast du es schon mal mit dem Tool SQLLoader (sqlldr) von Oracle versucht. Da kannst du über ein Controlfile die Struktur deiner Daten angeben und die dann in deine Tabelle laden. Den Aufruf könntest du dann automatisieren und so die Daten regelmäßig importieren.

Hallo,
hier endlich das Beispiel für die externe Tabelle:

CREATE TABLE CSV_LADEN_TABELLE
( „SUBJECT“ VARCHAR2(300 CHAR),
„ITEM_ID“ VARCHAR2(300 CHAR)
)
ORGANIZATION EXTERNAL
( TYPE ORACLE_LOADER
DEFAULT DIRECTORY „ORACLE_DIRECTORY_IN“
ACCESS PARAMETERS
( records delimited BY ‚\n‘
characterset ‚WE8MSWIN1252‘
skip 1
fields terminated BY ‚;‘ optionally enclosed BY ‚"‘
MISSING FIELD VALUES ARE NULL
)
LOCATION
( ‚meine_csv.csv‘
)
)
;

Du musst nur das Directory anpassen (ORACLE_DIRECTORY_IN - ggf. musst Du noch eins anlegen) und die Location = Dateiname (meine_csv.csv).
Dann läßt sich auf die Tabelle wie auf eine ganz normale Tabelle zugreifen (nur SELECT möglich).
Ggf. musst Du auch das Charset und den Trenner anpassen… und den Record-Trenner… SKIP 1 gibt an, dass die erste Zeile nicht gelesen werden soll (da sie z.B. die Überschrift enhält).

Gruß,
Harry