Oracle
 sql >> Base de données >  >> RDS >> Oracle

Importer un fichier CSV dans une table Oracle à l'aide d'une procédure stockée

Le fichier CSV est un fichier délimité par des virgules dans lequel les champs sont séparés par la virgule. Dans cet article, je donne un exemple pour importer un fichier CSV dans une table oracle à l'aide d'une procédure stockée. La procédure stockée dans Oracle est une unité de programme PL/SQL qui peut être un package autonome ou dans une base de données.

Vous devez avoir un objet de répertoire dans la base de données Oracle faisant référence au chemin du serveur dans lequel le fichier est stocké. Dans l'exemple ci-dessous, j'utilise le nom de l'objet répertoire comme CSV_DIR et le nom de la procédure est read_csv. Également créé une fonction GetString dans la procédure read_csv pour obtenir la chaîne délimitée une par une .

Chargement du fichier CSV dans la table Oracle à l'aide de la procédure PL/SQL

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;

Veuillez noter que vous devez étudier votre fichier CSV pour mapper correctement la table cible. Gérez également le format de date pour les champs de date, conformément à votre format de données de date CSV.