Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/01/2012, 14h40   #1
Membre du Club
 
Inscription : février 2004
Messages : 116
Détails du profil
Informations personnelles :
Localisation : France, Maine et Loire (Pays de la Loire)

Informations forums :
Inscription : février 2004
Messages : 116
Points : 56
Points : 56
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 :
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 :
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 :
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
gaultier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 15h17   #2
Membre du Club
 
Inscription : février 2004
Messages : 116
Détails du profil
Informations personnelles :
Localisation : France, Maine et Loire (Pays de la Loire)

Informations forums :
Inscription : février 2004
Messages : 116
Points : 56
Points : 56
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.
gaultier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 15h18   #3
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 313
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 313
Points : 5 817
Points : 5 817
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 15h22   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 313
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 313
Points : 5 817
Points : 5 817
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 15h46   #5
Membre du Club
 
Inscription : février 2004
Messages : 116
Détails du profil
Informations personnelles :
Localisation : France, Maine et Loire (Pays de la Loire)

Informations forums :
Inscription : février 2004
Messages : 116
Points : 56
Points : 56
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é.
gaultier est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h06.


 
 
 
 
Partenaires

Hébergement Web