Oracle
 sql >> Datenbank >  >> RDS >> Oracle

CSV-Datei in Oracle-Tabelle mit gespeicherter Prozedur importieren

Die CSV-Datei ist eine durch Kommas getrennte Datei, in der Felder durch das Komma getrennt sind. In diesem Artikel gebe ich ein Beispiel zum Importieren einer CSV-Datei in eine Oracle-Tabelle mithilfe einer gespeicherten Prozedur. Die gespeicherte Prozedur in Oracle ist eine PL/SQL-Programmeinheit, die eigenständig oder in einem Datenbankpaket vorliegen kann.

Sie müssen ein Verzeichnisobjekt in der Oracle-Datenbank haben, das auf den Serverpfad verweist, in dem die Datei gespeichert ist. Im folgenden Beispiel verwende ich den Verzeichnisobjektnamen als CSV_DIR und den Prozedurnamen als read_csv. Außerdem wurde eine Funktion GetString in der Prozedur read_csv erstellt, um die getrennte Zeichenfolge einzeln abzurufen .

Laden einer CSV-Datei in eine Oracle-Tabelle mithilfe des PL/SQL-Verfahrens

CREATE OR REPLACE PROCEDURE read_csv
IS
l_file_type UTL_FILE.file_type;

l_string VARCHAR2 (32765);

TYPE Fieldvalue IS TABLE OF VARCHAR2 (4000)
INDEX BY BINARY_INTEGER;

t_field Fieldvalue;

FUNCTION GetString (Source_string IN VARCHAR2,
Field_position IN NUMBER,
UnTerminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
RETURN VARCHAR2
IS
iPtrEnd PLS_INTEGER := 0;
iPtrStart PLS_INTEGER := 0;
vcSourceStrCopy VARCHAR2 (4000) := Source_string;
BEGIN
IF UnTerminated
THEN
vcSourceStrCopy := vcSourceStrCopy || Delimiter;
END IF;

IF Field_Position > 1
THEN
iPtrStart :=
INSTR (vcSourceStrCopy,
Delimiter,
1,
Field_Position - 1)
+ LENGTH (Delimiter);
ELSE
iPtrStart := 1;
END IF;

iPtrEnd :=
INSTR (vcSourceStrCopy,
Delimiter,
1,
Field_Position);
RETURN SUBSTR (vcSourceStrCopy, iPtrStart, (iPtrEnd - iPtrStart));
END GetString;
BEGIN
l_file_type := UTL_FILE.Fopen ('CSV_DIR', 'abc.csv', 'r');

LOOP
UTL_FILE.Get_Line (l_file_type, l_string);

l_string := l_string || ',';

FOR n IN 1 .. REGEXP_COUNT (l_string, ',')
LOOP
t_field (n) :=
Getstring (l_string,
n,
FALSE,
',');

END LOOP;

INSERT INTO EMP (EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)
VALUES (t_field (1),
t_field (2),
t_field (3),
t_field (4),
TO_DATE (t_field (5), 'dd/mm/yyyy'),
t_field (6),
t_field (7),
t_field (8));
END LOOP;

UTL_FILE.Fclose (l_file_type);

COMMIT;
EXCEPTION
WHEN OTHERS
THEN
IF UTL_FILE.is_open (l_file_type)
THEN
UTL_FILE.Fclose (l_file_type);
END IF;
END;

Bitte beachten Sie, dass Sie Ihre CSV-Datei studieren müssen, um die Zieltabelle korrekt abzubilden. Behandeln Sie auch das Datumsformat für Datumsfelder gemäß Ihrem CSV-Datumsdatenformat.