IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

[PL/SQL] lecture de csv, traitement et ecriture du résultat dans un fichier CSV


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 64
    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 :

    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 :

    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

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    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 862
    Par défaut
    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.

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 64
    Par défaut
    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

  4. #4
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    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 862
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    utl_file.put_line (v_id_sortie, v_ancien_nom || ';' || v_nouveau_nom || ';' ||
                                    v_result || ';' || v_motif);

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 64
    Par défaut
    Merci plaineR pour ta reponse si rapide , je vais tester tous ca et je vais repondre asap

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 64
    Par défaut
    voila le bout de code que j' ai developpé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    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 ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] vba, stocker des résultats dans un fichier csv
    Par linann dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/06/2010, 21h17
  2. Réponses: 0
    Dernier message: 26/05/2009, 10h10
  3. exporter données sql dans un fichier csv en java
    Par pinkemma dans le forum JDBC
    Réponses: 2
    Dernier message: 07/03/2007, 09h23
  4. [CSV] Ajouter et supprimer des ligne dans un fichier CSV
    Par gpsevasion dans le forum Langage
    Réponses: 3
    Dernier message: 28/02/2007, 17h00
  5. [CSV] Ecriture des données dans un fichier
    Par kagura dans le forum Langage
    Réponses: 3
    Dernier message: 07/11/2006, 22h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo