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 :

Le fichier UTL_FILE reste ouvert par Oracle


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut Le fichier UTL_FILE reste ouvert par Oracle
    Salut,

    J'ai un problème assez étrange... j'ai un script d'extraction basé sur un bloc PL/SQL qui écrit dans un fichier avec UTL_FILE. Ensuite, le fichier est envoyé à une autre machine par un script ksh. Avant d'envoyer le fichier, le script vérifie qu'il n'est pas ouvert par un autre process, en utilisant fuser. Or, apparemment il reste ouvert par Oracle, malgré le UTL_FILE.FCLOSE :
    [test@octopus] fuser /temp/monfichier.dat
    /temp/monfichier.dat: 20925o 20917o 20909o 20903o 20899o
    [test@octopus] ps -ef | egrep "(20925|20917|20909|20903|20899)"
    oracle 18195 1 0 15:18:03 ? 0:01 ora_p000_MABASE
    oracle 18203 1 0 15:18:03 ? 0:01 ora_p004_MABASE
    oracle 18199 1 0 15:18:03 ? 0:01 ora_p002_MABASE
    test 19208 5462 0 15:19:41 pts/39 0:00 egrep (18203|18201|18199|18197|18195)
    oracle 18197 1 0 15:18:03 ? 0:01 ora_p001_MABASE
    oracle 18201 1 0 15:18:03 ? 0:00 ora_p003_MABASE
    D'après ce que j'ai vu sur Google, les processes ora_pxxx_MABASE sont liés au parallélisme (et ma requête d'extraction utilise effectivement un hint PARALLEL). Au bout de quelques instants (~2mn) ces processes s'arrêtent et le fichier est libéré. Mais je ne comprends pas pourquoi le fichier n'est pas fermé immédiatement quand je fais FCLOSE...

    A titre indicatif, voilà le "squelette" du bloc PL/SQL (je n'ai pas le droit de mettre le code complet) :
    Code PLSQL : 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
     
    DECLARE
    	CURSOR mon_curseur IS
            SELECT   /*+ PARALLEL(CSC, 4) ... */
            ...;
    BEGIN
    	BEGIN
    		-- Open extraction file
    		V_FILE := UTL_FILE.FOPEN(V_FILE_DIR,V_FILE_NAME,'W');
    	EXCEPTION
    		...
    	END;
     
    	FOR rec IN mon_curseur
    	LOOP
    		BEGIN
    			UTL_FILE.PUT_LINE(V_FILE, ...);
    		EXCEPTION
    			...
    		END;
    	END LOOP;
     
    	UTL_FILE.FCLOSE(V_FILE);
    END;

    Connaissez-vous un moyen de régler ce problème ? Ne pas utiliser le parallélisme n'est pas acceptable en terme de performances...

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    UTL_FILE.FCLOSE(V_FILE), s'exécute bien-t-il à chaque fois ? Parce qu'en cas d'erreur par exemple c'est pas le cas puisqu'il n'y a pas d'exception générale

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par orafrance Voir le message
    UTL_FILE.FCLOSE(V_FILE), s'exécute bien-t-il à chaque fois ? Parce qu'en cas d'erreur par exemple c'est pas le cas puisqu'il n'y a pas d'exception générale
    J'ai vérifié en mettant un DBMS_OUTPUT, le FCLOSE est bien exécuté
    En plus maintenant l'erreur ne se produit plus, alors qu'elle se produisait à chaque fois tout à l'heure...
    Je suis vraiment largué là !

    PS: il y a bien un bloc d'exception global, je ne l'ai juste pas mis dans mon post...

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par tomlev Voir le message
    PS: il y a bien un bloc d'exception global, je ne l'ai juste pas mis dans mon post...
    faut mettre le FCLOSE dedans alors...

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ca ne change rien, l'exécution ne passe jamais dedans...

    Par contre j'ai pensé à un truc... je ne sais pas exactement comment fonctionne le parallélisme d'Oracle en interne, mais je suppose que ça implique des fork... et si mes souvenirs sont bons, le process fils résultant d'un fork hérite des descripteurs de fichiers du père. Donc, si j'ouvre le fichier après le fork (donc après l'ouverture du curseur), les process fils n'auront pas le descripteur, ce qui devrait résoudre le problème... enfin j'espère ! Je vais essayer en tous cas...

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    C'était bien ça ! Pour une requête parallèle, il faut ouvrir le curseur avant d'ouvrir le fichier, sinon les process qui exécutent la requête héritent du descripteur, et comme ils ne se terminent pas tout de suite le fichier reste ouvert...

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 06/05/2014, 09h34
  2. Réponses: 3
    Dernier message: 13/12/2012, 00h21
  3. [XL-2003] Un fichier semble reste ouvert
    Par DjLeChuck dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/05/2009, 09h21
  4. Tester si un fichier est déjà ouvert par un programme tiers
    Par E@gle_One dans le forum Entrée/Sortie
    Réponses: 16
    Dernier message: 17/04/2008, 11h33
  5. Nombre maximum de fichiers ouverts par processus
    Par galinoo dans le forum Windows
    Réponses: 3
    Dernier message: 27/10/2004, 17h47

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