Procédure PL/SQL : passer un fichier .txt ou .csv en paramètre
Bonjour à tous,
Je travaille sur une base de données que je veux mettre à jour en utilisant un fichier txt ou csv.
Pour cela, je veux écrire une procédure en PL/SQL qui prend en paramètre ce fichier, parcours ses lignes et applique les mises à jour.
Ce que je demande ici c'est comment passer un fichier en paramètre. J'ai pensé à ceci :
Code:
create or replace procedure MiseAJour (monFichier UTL_FILE.FILE_TYPE) IS ...
des suggestions ?
Merci d'avance
mise à jour de la table : idée tri du fichier et de la table
Bonjour,
Toujours dans le but de mettre à jour ma base, j'ai essayé de résoudre deux problèmes dans mon script:
1- traiter les lignes de mon fichier champ par champ, et ceci en utilisant les deux fonctions substr et instr
2-insertion des données du fichier dans ma table (Avion dans notre cas), et ceci en optant pour l'idée suivante :
- trier les lignes de mon fichier
- créer un curseur sur ma table dont les valeurs sont ordonnées
- insertion des données
voilà ce que j'ai fait jusqu'à maintenant :
1- là c'est le code du curseur créé
Code:
1 2
|
cursor avion_cur is select id from Avion order by id; |
2- là c'est le code du tri de mon fichier
Code:
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
|
-- variables déclarées
i, num1, num2 integer;
pos_fich1, pos_fich2 integer;
anc_position, position integer;
chaine1, chaine2 varchar2(20);
buffer, buffer1, buffer2, buffAux varchar2(1500);
fich_resultat UTL_FILE.FILE_TYPE;
-- tri
-- creation du descripteur du fichier
fich_resultat := UTL_FILE.FOPEN ('REPERTOIRE', 'test_result', 'r');
-- tri des lignes du fichier test_result
while echange loop
echange := vrai;
loop
begin
UTL_FILE.GET_LINE(fich_resultat, buffer1);
UTL_FILE.GET_LINE(fich_resultat, buffer2);
exception
when no_data_found then exit;
end;
pos_fich1 := instr (buffer1, ' ');
pos_fich2 := instr (buffer1, ' ');
chaine1 := substr (buffer1, 0, pos_fich -1);
chaine2 := substr (buffer2, 0, pos_fich -1);
num1 := to_number(chaine1);
num2 := to_number(chaine2);
if (num1 > num2) then
buffAux := buffer1;
buffer1 :) buffer2;
buffer2 := buffAux;
echange := faux;
end loop;
end loop; |
En fait, comme le fichier a les mêmes champs que la table, le 1er champ de chaque ligne est un nombre. Donc j'ai procédé comme suit pour le tri :
* extraction du premier champ de chaque ligne
* conversion en nombre (en utilisant la focntion to_number())
* tri à bulles des lignes du fichier
j'aime bien que vous me donnez des remarques ou des suggestions sur ce que je viens de faire.
Pour l'insertion des données dans la table, j'y travaille encore.
Merci d'avance pour tout :ccool: