1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| SET serveroutput on size 1000000
DECLARE
v_empfile UTL_FILE.file_type;
v_directory VARCHAR2 (50) := 'LUIS';
v_filename VARCHAR2 (20) := 'Bilbao.csv';
v_emprec VARCHAR2 (120);
v_count INTEGER := 0;
ma_chaine VARCHAR2 (100);
ma_requete VARCHAR2 (300);
ls_colonne VARCHAR2 (20);
nombre_de_pv NUMBER;
position_curseur NUMBER := 1;
position_separateur NUMBER;
BEGIN
v_empfile := UTL_FILE.fopen (v_directory, v_filename, 'r');
LOOP
BEGIN
UTL_FILE.get_line (v_empfile, v_emprec);
ma_chaine := v_emprec || ';'; -- je rajoute un point-virgule à la fin
IF v_count = 0
THEN
---------- TRAITEMENT DE LA PREMIERE LIGNE POUR CREER LA TABLE ----------
v_count := 1;
ma_requete := 'CREATE TABLE ma_table ('; -- début de la requête de création de table
nombre_de_pv :=
LENGTH (ma_chaine)
- LENGTH (REPLACE (ma_chaine, ';', NULL)); -- je compte le nombre de point-virgule dans ma chaîne = nombre de colonnes
FOR i IN 1 .. nombre_de_pv -- boucle sur le nombre d'éléments de ma chaîne
LOOP
position_separateur := INSTR (ma_chaine, ';', 1, i); -- recherche de la position du point-virgule
ls_colonne :=
SUBSTR (ma_chaine,
position_curseur,
position_separateur - position_curseur
); -- on extrait le nom de la colonne
ma_requete := ma_requete || ls_colonne || ' VARCHAR2(20),'; -- on crée la requête de création de table
position_curseur := position_separateur + 1; -- on avance le curseur dans la chaîne
END LOOP;
ma_requete := SUBSTR (ma_requete, 1, LENGTH (ma_requete) - 1)
|| ');'; --on termine la requête en enlevant le dernier point-virgule ajouté
DBMS_OUTPUT.put_line (ma_requete);
ELSE
---------- TRAITEMENT DE LA LIGNE POUR L'INSERER ----------
ma_requete := 'INSERT INTO ma_table VALUES('; -- début de la requête d'insertion
nombre_de_pv :=
LENGTH (ma_chaine)
- LENGTH (REPLACE (ma_chaine, ';', NULL)); -- je compte le nombre de point-virgule dans ma chaîne = nombre de colonnes
FOR i IN 1 .. nombre_de_pv -- boucle sur le nombre d'éléments de ma chaîne
LOOP
position_separateur := INSTR (ma_chaine, ';', 1, i); -- recherche de la position du point-virgule
ls_colonne :=
SUBSTR (ma_chaine,
position_curseur,
position_separateur - position_curseur
); -- on extrait la valeur de la colonne
ma_requete := ma_requete || '''' || ls_colonne || ''','; -- on crée la requête d'insertion
position_curseur := position_separateur + 1; -- on avance le curseur dans la chaîne
END LOOP;
ma_requete := SUBSTR (ma_requete, 1, LENGTH (ma_requete) - 1)
|| ');'; --on termine la requête en enlevant la dernière virgule ajoutée
DBMS_OUTPUT.put_line (ma_requete);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN -- on a atteint la fin du fichier, on sort de la boucle
DBMS_OUTPUT.put_line ( 'End of file '
|| v_filename
|| ' - '
|| v_count
|| ' records retrieved'
);
EXIT;
END;
END LOOP;
UTL_FILE.fclose (v_empfile); -- fermeture du fichier
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ('SQLERRM: ' || SQLERRM);
DBMS_OUTPUT.put_line ('SQLCODE: ' || SQLCODE);
END;
/ |