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 :

Utilisation UTL_FILE avec sqlplus et TOAD


Sujet :

Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Février 2004
    Messages : 118
    Points : 90
    Points
    90
    Par défaut Utilisation UTL_FILE avec sqlplus et TOAD
    Bonjour à tous

    J'ai une erreur dans l'utilisation de UTL_FILE en mode sqlplus mais pas avec TOAD.

    Voici ma fonction :

    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    CREATE OR REPLACE PROCEDURE OPS$PROJET.p_fic_pmetier (wtype IN varchar2) is
    -- EGA le 21/07/2011
    -- Procédure pour génération du fichier produits metiers
    -- 1 parametres : A pour Achat et V pour Ventes
    --
      -- Noms des fichiers --
      wnom_fichier       Varchar2(50);
      wextension_fichier varchar2(3);
      wfichier           varchar2(53);
      -- Noms des répertoires il faut au préalable 
      -- déclaré un DIRECTORY oracle avec le nom utilisé
      LC$Dir_out  Varchar(50)   := 'FICOUT' ; 
      -- Pointeurs de fichier --
      LF$FicOUT    UTL_FILE.FILE_TYPE ;
      -- 
      LC$Ligne    Varchar2(32767) ;
      -- 
      wexists       boolean;
      wtaille_fic   integer;
      wtaille_bloc  integer; 
      --
      -- Curseur pour les datas
      --
      cursor c1 is 
      select type
        ,idlogiciel 
        ,DET_PRDMCODE
        ,DET_PRDLIB
        ,DET_CONDIT
        ,DET_UNIT
        ,DET_TXTVA
        ,DET_NIV1
        ,DET_NIV2
        ,DET_NIV3
        ,DET_NIV4
        ,DET_NIV5
        ,DET_NATPROD
        ,APPLICD
        ,MAJD
      from produits_metier
      where type = wtype;
      -- 
      cc1 c1%ROWTYPE;
     
    Begin
      -- Construction du nom du fichier
      select f_parama_lib4('TMZ','NFPM'),lpad(seq_ext_tmzprm.nextval,3,0) 
      into wnom_fichier,wextension_fichier
      from dual;
      --
      wfichier := wnom_fichier||wextension_fichier;
      --
      -- Ouverture du fichier
        LF$FicOUT := UTL_FILE.FOPEN( LC$Dir_out, wfichier, 'W', 32764 ) ;
    --
     
    OPEN C1;
    --
    LOOP    
        -- RAZ de la variable de travail
    --    LC$Ligne := NULL;
    --    
        FETCH c1 INTO cc1;
        EXIT WHEN c1%NOTFOUND;
    --        
    --        
        LC$Ligne := cc1.idlogiciel||cc1.DET_PRDMCODE||cc1.DET_PRDLIB||cc1.DET_CONDIT||cc1.DET_UNIT||cc1.DET_TXTVA
        ||cc1.DET_NIV1||cc1.DET_NIV2||cc1.DET_NIV3||cc1.DET_NIV4||cc1.DET_NIV5||cc1.DET_NATPROD||cc1.APPLICD||cc1.MAJD;
    --        
        UTL_FILE.PUT_LINE(LF$FicOUT,LC$Ligne,TRUE);
    --  
        -- On teste le type de ligne pour connaitre la table à mettre à jour
        --
        -- Si type = V alors produits métiers pour ventes. MAJ de la table ARTNEW
        --
        if cc1.type = 'V' then
    --    
            update artnew set prd_metier = 'N'
                where rgpart = cc1.det_prdmcode
                and art = rgpart;
    --    --            
        -- Si type = A alors produits métiers pour achats. MAJ de la table MATIERE
        --
        elsif cc1.type = 'A' then
     
            update matiere set prd_metier = 'N'
                where mat = substr(cc1.det_prdmcode,4,length(cc1.det_prdmcode) - 3);
        end if;
     
        commit;
    -- 
    END LOOP;
    --
    CLOSE C1;  
    --
    -- Fermeture de l'ensemble de fichiers ouverts
    --
    UTL_FILE.FCLOSE_ALL;
    --
    -- Lecture des attributs du fichier créé
    --
    UTL_FILE.FGETATTR(LC$Dir_out, wfichier,wexists,wtaille_fic,wtaille_bloc);
    --
    -- Destruction du fichier si il est vide
    --
    if wtaille_fic = 0 then
        UTL_FILE.FREMOVE( LC$Dir_out,wfichier);
    end if;
    --
    END;
    /
    Création de mon directory :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    create directory ficout as '/mi16-appli/prod/fichiers/sortie';
    GRANT READ, WRITE ON DIRECTORY ficout TO PUBLIC;
    Lorsque j’exécute la fonction sous sqlplus j'obtiens l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ERROR at line 1:
    ORA-29283: invalid file operation
    ORA-06512: at "SYS.UTL_FILE", line 449
    ORA-29283: invalid file operation
    ORA-06512: at "OPS$PROJET.P_FIC_PMETIER", line 54
    ORA-06512: at line 1
    Je suis connecté avec le même utilisateur sql lors des deux lancements.

    Si j’exécute la même procédure sous TOAD, je n'ai pas d'erreur.

    Infos complémentaires

    Version de la base 9.2.0.4
    Version client oracle windows : 8.0.6.0

    Merci d'avance pour votre aide

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Février 2004
    Messages : 118
    Points : 90
    Points
    90
    Par défaut
    Complément d'information :

    Si j'utilise le SQLPLUS de mon poste (version 8.0.6.0), alors pas d'erreurs.

    Le problème se produit avec le sqlplus du serveur.

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Peu importe qui exécute la procédure Toad ou sqlplus ! Il n’y pas de magie dans Toad !
    Peut être que vous est connectez avec le même utilisateur mais sur des bases différentes.
    A priori vous avez une anomalie sur l’instruction UTL_FILE.FOPEN investiguez d’où ça vient.
    L’erreur vous dit soit que le répertoire n’existe pas soit que Oracle n’a pas les droits nécessaires pour écrire dedans.

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par gaultier Voir le message
    ...
    Le problème se produit avec le sqlplus du serveur.
    Vérifiez qu'il se connect bien à la même base.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Février 2004
    Messages : 118
    Points : 90
    Points
    90
    Par défaut
    J'ai ma réponse après recherche intense avec mon DBA

    Lorsque j'utilise Toad ou sqlplus de mon poste client, le user de création utilisé est celui qui démarre la base.

    Si j'utilise le sqlplus du serveur, c'est le compte unix avec lequel je suis connecté qui est utilisé.

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

Discussions similaires

  1. [Kylix 3] Je n'arrive pas à utiliser MySQL
    Par usebob dans le forum EDI
    Réponses: 4
    Dernier message: 15/04/2005, 10h18
  2. Utilisation iterator avec une classe perso
    Par SteelBox dans le forum C++
    Réponses: 19
    Dernier message: 07/03/2005, 11h30
  3. Réponses: 6
    Dernier message: 24/02/2005, 09h44
  4. PB de vue utilisant UNION avec ENTERPRISE MANAGER
    Par punglas dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/12/2004, 15h18
  5. Réponses: 12
    Dernier message: 02/02/2004, 13h41

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