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

PL/SQL Oracle Discussion :

Mémoriser et réutiliser le pointeur d'un fichier déjà ouvert


Sujet :

PL/SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut Mémoriser et réutiliser le pointeur d'un fichier déjà ouvert
    Bonjour,

    Je dois extraire des données d'une table et les mettre dans un fichier en fonction de la valeur d'1 des colonnes.

    J'ai donc fais un curseur pour parcourir la table et je génère un nom de fichier pour chacune des valeurs de la colonne et je le stocke dans une collection.

    Mon problème est de retrouver le pointeur du fichier déjà créé et ouvert pour écrire dans le bon fichier lorsqu'une valeur se représente après la première fois

    Voici une partie du code, celle qui est concernée par le problème
    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
    DECLARE
    CURSOR c_lecture_traces(date_limite_purge IN DATE) 
    IS SELECT DATE_TRACE__TMS, COMPO_INIT__CHR, TECHNO__CHR, 
              NIVEAU_TRACE__CHR, COMPO_TRACE__CHR, TYP_COUCHE__CHR, 
              NOM_ETAPE__CHR, TYP_COMPO__CHR, MESSAGE_CODE__CHR, 
              MESSAGE_TEXTE__CHR, DESC_EXCEPTION__CHR, DETAILS__CHR, 
              FONCTION_APPELEE__CHR, FONCT_NUM_LIGNE__ENT, MESSAGE_DATE_RECEP__TMS, 
              MESSAGE_NOM_QUEUE__CHR, DATE_CREAT__DTE, NOM_CREATEUR__CHR, 
              DATE_MODIF__DTE, NOM_MODIF__CHR
       FROM   LOG_TRACES
       WHERE  DATE_TRACE__TMS < date_limite_purge ;
     
       -- l'idée ici est de stocker le pointeur du fichier en fonction du nom du fichier
       TYPE TYPE_INFOS_FICHIER IS TABLE OF UTL_FILE.FILE_TYPE INDEX BY VARCHAR2(100) ;
       infos_fichier TYPE_INFOS_FICHIER ;
     
    BEGIN
        -- Recherche de la date limite de conservation des traces
        SELECT TRUNC(SYSDATE-5) INTO date_purge FROM dual;
     
        -- Lecture de toutes les traces avant la date de purge
        FOR lecture_colonnes IN c_lecture_traces (date_purge+1)
        LOOP
            date_trace := TO_CHAR(lecture_colonnes.DATE_TRACE__TMS, 'YYYYMMDD');
            serveur := TRIM(lecture_colonnes.NOM_CREATEUR__CHR);
    	composant := TRIM(lecture_colonnes.COMPO_INIT__CHR);
     
    	nom_fichier := COMPOSANT || '-' || date_trace || '-' || serveur ;
     
            IF infos_fichier.EXISTS(nom_fichier) = FALSE THEN
    		    infos_fichier(nom_fichier) := UTL_FILE.FOPEN( 'LOG_EXTRACTDIR', nom_fichier, 'W', 32767 ) ;
            END IF;
     
    ....
    Et l'erreur est :
    ORA-29283: invalid file operation
    Merci de votre aide.

  2. #2
    En attente de confirmation mail
    Inscrit en
    Mars 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 205
    Points : 230
    Points
    230
    Par défaut
    Le moyen de pointer sur un fichier, c'est le file handle que te retourne le fopen, si tu dois ouvrir dix fichiers, tu dois stocker dix file handle différents dans un tableau PL/SQL que je te conseille d'indexer par un nombre (ton nom_fichier dans la procédure, je le sens pas) et qui contiendra la correspondance avec le type de données que tu veux écrire dans chaque fichier.

    Ah, l'erreur que tu rencontres peut aussi être due au fait que tu ne possède pas les droit suffisants au niveau système pour écrire dans le répertoire choisi.

    Mais bon, c'est pas simple ton truc...

    Je te conseillerais plutôt de trier la table par la colonne considérée dans ton curseur, et de tester cette valeur dans ta boucle. Tu sais alors que quand tu change de valeur de colonne, tu dois fermer le fichier en cours et en ouvrir un autre, ce qui fait que tu ne gères plus qu'un fichier à la fois.

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Merci Sgora
    J'ai testé mais le problème est que la table est très grosse et j'ai explosé le TBS TEMP.

    En faisant d'autres tests, j'ai aussi réussi à exploser le nombre de pointeur (50 il me semble).

    Donc la solution que j'ai retenu est de stocker les noms de fichier dans un tableau, de vérifier l'existence. Si le nom existe, j'ouvre le fichier an ajout sinon je l'ouvre en écriture. Et je le ferme à chaque fois.
    Ca m'oblige à ouvrir/fermer à chaque fois mais ca fonctionne bien

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

Discussions similaires

  1. [JNA] Pointeur : lire un fichier
    Par javan00b dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 17/03/2010, 04h37
  2. Déplacer un pointeur dans un fichier
    Par reitsab dans le forum C++
    Réponses: 5
    Dernier message: 02/05/2009, 16h13
  3. double pointeur dans un fichier txt
    Par micka180 dans le forum VBScript
    Réponses: 14
    Dernier message: 22/01/2008, 16h23
  4. pointeur FILE* sur fichier "virtuel"
    Par aymeric__ dans le forum C
    Réponses: 8
    Dernier message: 20/09/2006, 08h14
  5. Pointeur sur un fichier
    Par koudjo dans le forum C++Builder
    Réponses: 1
    Dernier message: 23/06/2006, 16h41

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