Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 04/10/2011, 16h46   #1
Nouveau Membre du Club
 
Inscription : avril 2007
Messages : 95
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 95
Points : 25
Points : 25
Par défaut [UTL_FILE] invalid operation

Bonjour à tous

Je fais quelques tests avec UTL_FILE mais je ne parviens pas à mes fins, alors je me permets de venir vous demander votre aide. Je précise que suis débutant en PL/SQL.

Je définis ma procédure comme suit :
Code sql :
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
SET echo ON
SET feedback ON
SET term ON
SET serveroutput ON
 
CREATE OR REPLACE directory mydir AS 'G:\7000 DEVNAT\7300 LCBHoS\7310 Projets-Maintenances-Etudes\01-Projets\MOA-MOE\P-Interface LCB-SINERGI\Scripts de reprise des données\01-DEV220\01-ZCN3';
GRANT READ,WRITE ON DIRECTORY mydir TO user;
 
CREATE OR REPLACE PROCEDURE generateFile(fileName IN varchar2) IS 
 
    CURSOR c_get_cltd IS SELECT DISTINCT idbien FROM llcbtbien;
 
	l_r_fileHandler    UTL_FILE.FILE_TYPE;
	l_s_open_mode      CONSTANT VARCHAR2(1) := 'w'; 
	l_bi_max_linesize  CONSTANT BINARY_INTEGER := 690;
	l_s_outputLine     VARCHAR2(690);
	l_d_currentdate    DATE;
 
	BEGIN
 
		l_r_fileHandler := UTL_FILE.FOPEN(location => 'MYDIR',
										   filename => fileName,
										   open_mode => l_s_open_mode,
										   max_linesize => l_bi_max_linesize);
 
		FOR c_get_cltd_rec IN c_get_cltd LOOP  
			l_s_outputLine := c_get_cltd_rec.idbien;
			UTL_FILE.PUT_LINE(file => l_r_fileHandler,buffer => l_s_outputLine);
		END LOOP; 
 
		UTL_FILE.FFLUSH(l_r_fileHandler);
		UTL_FILE.FCLOSE(l_r_fileHandler); 
 
		EXCEPTION 
		WHEN UTL_FILE.INVALID_PATH THEN 
			 dbms_output.put_line('invalid path'); 
		WHEN UTL_FILE.INVALID_MODE THEN 
			 dbms_output.put_line('invalid mode');
		WHEN UTL_FILE.INVALID_MAXLINESIZE THEN 
			 dbms_output.put_line('invalid maxlinesize');
		WHEN UTL_FILE.INVALID_FILEHANDLE THEN 
			 dbms_output.put_line('invalid filehandle');
		WHEN UTL_FILE.INVALID_OPERATION THEN 
			 dbms_output.put_line('invalid operation');
		WHEN UTL_FILE.WRITE_ERROR THEN
			 dbms_output.put_line('write_error');
 
END generateFile;
 
/

La procédure se crée sans erreur sous SQL*Plus. Je l'exécute ensuite de la manière suivante :
Code sql :
execute generateFile('test.txt');

Et SQL*Plus m'affiche "invalid operation"... C'est donc une exception UTL_FILE.INVALID_OPERATION qui est levée. Mais je ne vois vraiment pas pourquoi. Le chemin vers le répertoire est correct. Le fichier cible existe et il me semble que la commande GRANT assure les droits en écriture sur ce répertoire au user courant oracle. Je ne sais plus trop où chercher...

Une idée ? Merci !
mitmit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 16h56   #2
Membre du Club
 
Homme Arnaud
Inscription : octobre 2002
Messages : 56
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 32
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2002
Messages : 56
Points : 66
Points : 66
Bonjour,

Code :
GRANT READ,WRITE ON DIRECTORY mydir TO user;

Ceci grant l'accès en lecture/écriture au directory Oracle "mydir" à l'utilisateur qui exécute le bloc.

Cependant, l'objet "mydir" n'est qu'un pointeur vers un dossier du système de fichier. Tu peux définir les accès VIA ORACLE avec des grants, mais tout ceci est indépendant des droits d'accès vers le répertoire définis sur le système de fichier...

En particulier, l'utilisateur OS qui fait tourner la base doit avoir le droit d'accès en lecture écriture sur le répertoire "G:\7000 DEVNAT\7300 LCBHoS\7310 Projets-Maintenances-Etudes\01-Projets\MOA-MOE\P-Interface LCB-SINERGI\Scripts de reprise des données\01-DEV220\01-ZCN3".

Ceci doit être fait au niveau OS (windows ou unix), et ne peut pas être fait depuis la base.


[Edit] Si la base à effectivement accès en R/W au répertoire de l'OS, en effet, comme l'a dit McM, savoir où ça plante pourrait déjà aider un peu
__________________
Tuning and optimization are not a fix to a bad design. A good design is a fix to a bad design.
Dajon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 16h56   #3
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
La base du débug : A quelle ligne de ta procédure l'erreur est-elle levée ?
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 08h11   #4
Nouveau Membre du Club
 
Inscription : avril 2007
Messages : 95
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 95
Points : 25
Points : 25
Merci beaucoup pour votre réactivité !

Je me mets en relation avec notre DB admin pour tirer au clair cette histoire de droits.
mitmit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 10h57   #5
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
as tu vérifié la valeur du parametre d'intialisation UTL_FILE

la commande...
Code :
SHOW parameter UTL_FILE
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 05/10/2011, 11h26   #6
Nouveau Membre du Club
 
Inscription : avril 2007
Messages : 95
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 95
Points : 25
Points : 25
merci à tous pour vos réponses, mais suite à une discussion avec un expert Oracle nous allons mettre en place une autre solution pour résoudre notre problème

je continuerai peut-être à fouiller quand j'aurai un peu de temps

bonne journée à tous
mitmit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 12h08   #7
Rédacteur
 
Inscription : décembre 2002
Messages : 2 387
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 387
Points : 3 272
Points : 3 272
Citation:
Envoyé par boussafi Voir le message
as tu vérifié la valeur du parametre d'intialisation UTL_FILE
Ca serait une bonne chose de vérifier vos propositions (UTL_FILE n'existe pas en tant que paramètre, c'est UTL_FILE_DIR), mais aussi de les expliquer.
Notre ami utilise la méthode avec DIRECTORY, qui est 100 % indépendante de UTL_FILE_DIR.
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 05/10/2011, 15h24   #8
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
oui c'est bien UTL_FILE_DIR.
DIRECTORY ne marche pas sans donner l'autorisation d'acces au disque via
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 05/10/2011, 16h20   #9
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Non c'est complètement faux, il n'y a aucune allusion à UTL_FILE_DIR dans la documentation Oracle sur la commande CREATE DIRECTORY, notamment dans les prérequis :
http://download.oracle.com/docs/cd/E...htm#SQLRF01207
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 17h00   #10
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
UTL_FILE_DIR n'influe pas sur la creation de repertoire logique de Oracle mais la manipuilation de ce repertoire necessite
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 05/10/2011, 17h05   #11
Rédacteur
 
Inscription : décembre 2002
Messages : 2 387
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 387
Points : 3 272
Points : 3 272
Citation:
Envoyé par boussafi Voir le message
UTL_FILE_DIR n'influe pas sur la creation de repertoire logique de Oracle mais la manipuilation de ce repertoire necessite
On attend juste que vous le prouviez
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 17h30   #12
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Deux méthodes pour utiliser utl_file :
La première consiste :
1- créer les directory (MYDI_DATA, MYDIR_LOG et MYDIR_BIN) selon le besoin sur ton serveur de base de données utilisé.

2- donner le grant read,write on directory to user;

La deuxième :
1- Utiliser UTL_FILE_DIR

http://www.sc.ehu.es/siwebso/KZCC/Or...tparams223.htm

La deuxième méthode parfois considérée comme un trou de sécurité (UTL_FILE_DIR).

Cordialement Salim.
__________________
Publications: http://schelabi.developpez.com/
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 17h44   #13
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Extrait de la note Metalink 206272.1, récupérée ici.
Citation:
NEW METHOD OF USING UTL_FILE PACKAGE IN 9.2 9iR2

In the past(i.e. pre 9iR2), accessible directories for the UTL_FILE functions were specified in the initialization file using the UTL_FILE_DIR parameter.
However, UTL_FILE_DIR access is not recommended in 9iR2. It is recommended that you use the CREATE DIRECTORY feature, which replaces UTL_FILE_DIR. Directory objects offer more flexibility and granular control to the UTL_FILE application administrator, can be maintained dynamically (that is, without shutting down the database), and are consistent with other Oracle tools.
Traduction rapide :
Citation:
Une nouvelle façon d'utiliser le package UTL_FILE en 9iR2

Dans le passé (pré 9iR2), les répertoires utilisables par les fonctions du package UTL_FILE étaient spécifiés dans le fichier d'initialisation via le paramètre UTL_FILE_DIR.
Néanmoins, ce paramétrage n'est plus recommandé en 9iR2.
Utilisez plutôt la fonctionnalité CREATE DIRECTORY, qui remplace UTL_FILE_DIRE.
Les objets DIRECTORIES offrent plus de flexibilité et de finesse aux applications qui utilisent UTL_FILE, peuvent être maintenues dynamiquement (c'est à dire sans interruption de service de la base de données), et sont cohérents avec les autres outils Oracle.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h13.


 
 
 
 
Partenaires

Hébergement Web