Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/02/2007, 16h23   #1
Nouveau Membre du Club
 
Inscription : mai 2005
Messages : 64
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 64
Points : 28
Points : 28
Par défaut [PL/SQL] lecture de csv, traitement et ecriture du résultat dans un fichier CSV

Bonjour tout le monde ,

je suis débutant dans le monde de plsql , et je me trouve confrenté a une problématique qui est la suivante :

1 - je doit récuperer des données d'un fichier CSV sous la forme suivante :

Citation:
ancien_nom_1;nouveau_nom_1
ancien_nom_2;nouveau_nom_2
ancien_nom_3;nouveau_nom_3
.
.
.
ancien_nom_n;nouveau_nom_n
2 - je doit mettre à jours les anciens nom et les modifier par les nouveaux

3 - je doit générer un fichier de sortie (CSV) sous la forme suivante :

<ancien_nom>;<nouveau_nom>;<OK|KO>;<Motif de l'echec>

exemple :

Citation:
ancien_nom_1;nouveau_nom_1;OK;
ancien_nom_2;nouveau_nom_2;OK;
ancien_nom_3;nouveau_nom_3;KO;nom inexistant
.
.
.
ancien_nom_n;nouveau_nom_n;KO;erreur chaine de caractère
j'utilise Oracle 9i

merci de votre aide
abdess6600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2007, 16h34   #2
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Tu devrais pouvoir t'en sortir avec le package UTL_FILE et un découpage de ta chaîne avec les fonctions SUBSTR et INSTR.
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2007, 16h54   #3
Nouveau Membre du Club
 
Inscription : mai 2005
Messages : 64
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 64
Points : 28
Points : 28
j'ai déja vu sur le forum des discutions qui parlaient de UTL_FILE , mais cela ne va concerner que le premier point de ma problématique .
Ce qui m'agasse c'est surtout le fichier de sortie qui doit pour chaque ligne , preciser le résultat de la mise à jour
abdess6600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2007, 17h10   #4
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Bah non, cela concerne aussi le fichier de sortie, sinon avec quoi veux-tu écrire dans un fichier ?

Pour reprendre point par point :
1. lecture du fichier avec utl_file et découpage de la chaîne avec INSTR et SUBSTR :
Code :
1
2
3
utl_file.get_line (v_id_fic, v_ligne);
v_ancien_nom := substr (v_ligne, 1, instr (v_ligne, ';') - 1);
v_nouveau_nom := substr (v_ligne, instr (v_ligne, ';') + 1);
2. Tu fais un update sur la table
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
begin
  UPDATE maTable
  SET colNom = v_nouveau_nom
  WHERE colNom = v_ancien_nom;
  IF sql%notfound then
    v_resultat := 'KO';
    v_motif := 'Aucune ligne'; 
  else
    v_resultat := 'OK';
    v_motif := NULL;
  end IF;
exception
   when others then
       v_resultat := 'KO';
       v_motif := 'Erreur oracle ' || sqlcode;
end;
3. Tu écris dans un fichier de sortie avec UTL_FILE :
Code :
1
2
utl_file.put_line (v_id_sortie, v_ancien_nom || ';' || v_nouveau_nom || ';' ||
                                v_result || ';' || v_motif);
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2007, 17h22   #5
Nouveau Membre du Club
 
Inscription : mai 2005
Messages : 64
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 64
Points : 28
Points : 28
Merci plaineR pour ta reponse si rapide , je vais tester tous ca et je vais repondre asap
abdess6600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2007, 12h42   #6
Nouveau Membre du Club
 
Inscription : mai 2005
Messages : 64
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 64
Points : 28
Points : 28
voila le bout de code que j' ai developpé

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
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
 
 DECLARE
  -- resultat de l'update et motifs --
  v_resultat VARCHAR2(256);
  v_motif VARCHAR2(256);
  -- variable ancien_nom et nouveau_nom --
  v_ancien_nom VARCHAR2(6);
  v_nouveau_nom VARCHAR2(6);
  -- Noms des fichiers --
  v_fichier_in   VARCHAR2(128) := 'testin.csv' ;      
  v_fichier_out  VARCHAR2(128) := 'testout.csv' ;     
   -- Noms des répertoires --
  v_dir_in   VARCHAR(30)   := 'FICHIERS_IN';               
  v_dir_out  VARCHAR(30)   := 'FICHIERS_OUT' ;              
  -- Pointeurs de fichier --
  v_id_fic	UTL_FILE.FILE_TYPE ;
  v_id_sortie	UTL_FILE.FILE_TYPE ;
  -- Tampon de travail --  
  v_ligne	VARCHAR2(32767) ;  
  -- Message --
  LC$Msg    VARCHAR2(256) ;
  -- Exception --
 LE$Fin    EXCEPTION ;
 
BEGIN
				 -- Ouverture du fichier en entrée
				  BEGIN
				    v_id_fic := UTL_FILE.FOPEN(   v_dir_in, v_fichier_in, 'R', 32764 ) ;
				  EXCEPTION
				    WHEN OTHERS THEN
					LC$Msg := SQLERRM || ' [' || v_dir_in || '] -> ' || v_fichier_in;
					RAISE LE$Fin ;
				  END ;
 
				  -- Ouverture du fichier en sortie
				  BEGIN
				    v_id_sortie := UTL_FILE.FOPEN( v_dir_out, v_fichier_out, 'W', 32764 ) ;
				  EXCEPTION
				    WHEN OTHERS THEN
					LC$Msg := SQLERRM || ' [' || v_dir_out || '] -> ' || v_fichier_out;
					RAISE LE$Fin ;
				  END ;	
 
 
				BEGIN
 
				LOOP utl_file.get_line (v_id_fic, v_ligne);
				v_ancien_nom := SUBSTR (v_ligne, 1, INSTR (v_ligne, ';') - 1);
				v_nouveau_nom := SUBSTR (v_ligne, INSTR (v_ligne, ';') + 1);
 
 
				BEGIN
				  UPDATE NOM
				  SET NOM.ANCIEN_NOM = v_nouveau_nom
				  WHERE NOM.ANCIEN_NOM = v_ancien_nom;
				  IF SQL%NOTFOUND THEN
				    v_resultat := 'KO';
				    v_motif := 'Aucune ligne'; 
				  ELSE
				    v_resultat := 'OK';
				    v_motif := NULL;
				  END IF;
				EXCEPTION
				   WHEN OTHERS THEN
				       v_resultat := 'KO';
				       v_motif := 'Erreur oracle ' || SQLCODE;
				END;
 
				utl_file.put_line (v_id_sortie, v_ancien_nom || ';' || v_nouveau_nom || ';' ||
				                                v_resultat || ';' || v_motif);
 
				END LOOP;
				END;
 
EXCEPTION
   WHEN LE$Fin THEN
     UTL_FILE.FCLOSE_ALL ;
     RAISE_APPLICATION_ERROR( -20100, LC$Msg ) ;
END ;
mais j'ai une erreur qui me bloque :

Citation:
The following error has occurred:

ORA-01403: Aucune donnée trouvée
ORA-06512: à "SYS.UTL_FILE", ligne 18
ORA-06512: à "SYS.UTL_FILE", ligne 610
ORA-06512: à ligne 46
la ligne 46 correspond a la ligne : utl_file.get_line (v_id_fic, v_ligne);

qu est ce queje doit faire ?
abdess6600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2007, 13h03   #7
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Cette exception se déclenche quand tu as lu toutes les lignes de ton fichier, il faut donc faire quelque chose comme cela :
Code :
1
2
3
4
5
6
7
8
9
10
11
loop
   begin
      -- lecture de la ligne du fichier
      utl_file.get_line (...);
      -- traitement de la ligne du fichier
      ...
   exception
        -- s'il n'y a plus de lignes a lire dans le fichier, je sors de ma boucle 
        when no_data_found then exit;
   end;
end loop;
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2007, 13h27   #8
Nouveau Membre du Club
 
Inscription : mai 2005
Messages : 64
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 64
Points : 28
Points : 28
merci plaineR, c'est de là d'ou vient l'erreur .
je l'ai corrigé , je le joint ci dessous
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
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
 
 DECLARE
  -- resultat de l'update et motifs --
  v_resultat VARCHAR2(256);
  v_motif VARCHAR2(256);
  -- variable ancien_nom et nouveau_nom --
  v_ancien_nom VARCHAR2(15);
  v_nouveau_nom VARCHAR2(15);
  -- Noms des fichiers --
  v_fichier_in   VARCHAR2(128) := 'testin.csv' ;      -- a adapter sur votre configuration
  v_fichier_out  VARCHAR2(128) := 'testout.csv' ;      -- a adapter sur votre configuration
  -- Noms des répertoires --
  v_dir_in   VARCHAR(30)   := 'FICHIERS_IN';               -- a adapter sur votre configuration
  v_dir_out  VARCHAR(30)   := 'FICHIERS_OUT' ;              -- a adapter sur votre configuration
  -- Pointeurs de fichier --
  LF$FicIN	    UTL_FILE.FILE_TYPE ;
  LF$FicOUT	    UTL_FILE.FILE_TYPE ;
  -- Tampon de travail --  
  v_ligne	VARCHAR2(32767) ;  
  -- Message --
  LC$Msg    VARCHAR2(256) ;
  -- Exception --
 LE$Fin    EXCEPTION ;
 
BEGIN
				 -- Ouverture du fichier en entrée
				  BEGIN
				    LF$FicIN := UTL_FILE.FOPEN( v_dir_in, v_fichier_in, 'R', 32764 ) ;
				  EXCEPTION
				    WHEN OTHERS THEN
					LC$Msg := SQLERRM || ' [' || v_dir_in || '] -> ' || v_fichier_in;
					RAISE LE$Fin ;
				  END ;
 
				  -- Ouverture du fichier en sortie
				  BEGIN
				    LF$FicOUT := UTL_FILE.FOPEN( v_dir_out, v_fichier_out, 'W', 32764 ) ;
				  EXCEPTION
				    WHEN OTHERS THEN
					LC$Msg := SQLERRM || ' [' || v_dir_out || '] -> ' || v_fichier_out;
					RAISE LE$Fin ;
				  END ;	
 
 
				BEGIN
 
				LOOP 
				UTL_FILE.GET_LINE (LF$FicIN, v_ligne);
 
				v_ancien_nom := SUBSTR (v_ligne, 1, INSTR (v_ligne, ';') - 1);
				v_nouveau_nom := SUBSTR (v_ligne, INSTR (v_ligne, ';') + 1);
 
 
				BEGIN
				  UPDATE NOM
				  SET NOM.ANCIEN_NOM = v_nouveau_nom
				  WHERE NOM.ANCIEN_NOM = v_ancien_nom;
				  IF SQL%NOTFOUND THEN
				    v_resultat := 'KO';
				    v_motif := 'Aucune ligne'; 
				  ELSE
				    v_resultat := 'OK';
				    v_motif := NULL;
				  END IF;
				EXCEPTION
				   WHEN OTHERS THEN
				       v_resultat := 'KO';
				       v_motif := 'Erreur oracle ' || SQLCODE;
				END;
 
				utl_file.put_line (LF$FicOUT, v_ancien_nom || ';' || v_nouveau_nom || ';' ||
				                                v_resultat || ';' || v_motif);
 
				END LOOP;
				Exception
    			 When NO_DATA_FOUND Then -- Fin du fichier en entrée
		        -- Fermeture des fichiers --
				UTL_FILE.FCLOSE( LF$FicIN ) ;
				UTL_FILE.FCLOSE( LF$FicOUT ) ;
 
				END;
 
EXCEPTION
   WHEN LE$Fin THEN
     UTL_FILE.FCLOSE_ALL ;
     RAISE_APPLICATION_ERROR( -20100, LC$Msg ) ;
END ;
abdess6600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h47.


 
 
 
 
Partenaires

Hébergement Web