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