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 02/08/2007, 17h12   #1
Invité de passage
 
Inscription : décembre 2005
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 6
Points : 1
Points : 1
Envoyer un message via MSN à sebvita
Par défaut [Oracle 10g] Lecture d'un fichier en PL/SQL

Bonjour à tous,

J'essaie actuellement sans succès d'écrire une procédure permettant de lire un fichier (alert_orcl.log pour être précis) avec des commandes PL/SQL.
J'ai trouvé le package UTL_FILE qui semblerait convenir, seulement, quand je m'en sers dans une procédure sous SQL*Plus, j'ai toujours l'erreur : "Procédure créée avec des erreurs de compilation".

Actuellement, j'ai essayé le code suivant :
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
SET SERVEROUTPUT ON
 
CREATE DIRECTORY FICHIERS_IN AS 'C:\scripts';
GRANT READ ON DIRECTORY FICHIERS_IN TO PUBLIC;
 
CREATE OR REPLACE PROCEDURE fic_ouv (nom_rep VARCHAR2, nom_fic VARCHAR2)
IS
ligne_fic VARCHAR2(200);
contenu_fic utl_file.file_type;
BEGIN
contenu_fic := UTL_FILE.FOPEN(nom_rep, nom_fic, 'r');
LOOP
BEGIN
UTL_FILE.GET_LINE(contenu_fic, ligne_fic);
DBMS_OUTPUT.PUT_LINE(ligne_fic);
EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.CLOSE(contenu_fic);
EXIT;
END;
END LOOP;
END;
/
 
EXECUTE fic_ouv ('FICHIERS_IN', 'test.txt');
/
Quelqu'un pourrait-il m'éclairer ?
sebvita est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2007, 17h19   #2
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Pour voir le détail de l'erreur fais :
Code :
SHOW err procedure fic_ouv
Je pense qu'après tu dois pouvoir t'en sortir tout seul
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2007, 17h46   #3
Invité de passage
 
Inscription : décembre 2005
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 6
Points : 1
Points : 1
Envoyer un message via MSN à sebvita
Dans ce cas, il m'affiche l'erreur suivante sur les lignes 4 et 6 (quand je déclare et définis contenu_fic) :
Code :
1
2
PL/SQL: Item ignored
PLS-00201: l'identificateur 'UTL_FILE' doit être déclaré
Et du coup, j'ai des erreurs à chaque fois que j'utilise contenu_fic.

Après recherche sur cette erreur, j'ai trouvé la discussion suivante :
http://www.developpez.net/forums/sho...d.php?t=128275

Cependant, la ligne de pifor me retourne l'erreur suivante :
Code :
ORA-00942: TABLE ou vue inexistante
Je ne comprends pas, étant donné que UTL_FILE est un package et non une table ou une vue.

Une autre discussion me paraît intéressante :
http://www.developpez.net/forums/arc.../t-154462.html

Est-ce vrai que le package UTL_FILE n'existe pas sous Oracle 10gXE ? Existe-t-il un moyen de l'ajouter ?

En vous remerciant une nouvelle fois,

Sebvita
sebvita est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2007, 18h01   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Tu ne dois pas avoir les droits sur UTL_FILE.
Fais un grant connecté en sys.


PS : c'est FCLOSE et pas CLOSE (ça t'évitera une erreur de plus)
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2007, 18h09   #5
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

Informations professionnelles :
Activité : Chef de projet
Secteur : Bâtiment

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
En 1OG, tu dois avoir un DIRECTORY (le paramètre UTL_FILE_DIR est obsolète dans cette version)
Code :
1
2
3
4
5
BEGIN
contenu_fic := UTL_FILE.FOPEN('FICHIERS', nom_fic, 'r');
LOOP
BEGIN
ou FICHIERS est un DIRECTORY
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2007, 13h55   #6
Invité de passage
 
Inscription : décembre 2005
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 6
Points : 1
Points : 1
Envoyer un message via MSN à sebvita
Merci pour vos réponses. J'ai actuellement installé la version 10gRC2 d'Oracle et j'ai corrigé les petites erreurs que vous m'aviez donné. Merci plaineR, j'avais complètement zappé cette commande pour voir les erreurs.

Maintenant, j'ai les droits et tout ça pour UTL_FILE mais il subsiste un problème, qui risque de vous parraître tout simple je parie...

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
SET SERVEROUTPUT ON
 
CREATE DIRECTORY FICHIERS_IN AS 'C:\scripts';
GRANT READ ON DIRECTORY FICHIERS_IN TO PUBLIC;
/
 
CREATE OR REPLACE PROCEDURE	fic_ouv (nom_rep VARCHAR2, nom_fic VARCHAR2)
IS
ligne_fic VARCHAR2(32767);
contenu_fic UTL_FILE.file_type;
BEGIN
contenu_fic := UTL_FILE.FOPEN(nom_rep, nom_fic, 'r');
LOOP
BEGIN
UTL_FILE.GET_LINE ('contenu_fic', 'ligne_fic', TRUE);
DBMS_OUTPUT.PUT_LINE(ligne_fic);
EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE(contenu_fic);
EXIT;
END;
END LOOP;
END;
/
 
EXECUTE fic_ouv ('FICHIERS_IN', 'test.txt');
La procédure contient des erreurs à la ligne 9, lors de l'utilisation de GET_LINE, et est donc inutilisable. Voici ce que j'obtiens comme erreurs :

Code :
1
2
3
4
5
LINE/COL  ERROR  
9/1  PL/SQL: Statement ignored  
9/1  PLS-00306: numéro ou types d'arguments erronés dans appel à 'GET_ LINE'  
9/1  PLS-00306: numéro ou types d'arguments erronés dans appel à 'GET_ LINE'  
9/35  PLS-00363: expression 'ligne_fic' ne peut être utilisée comme cib le d'affectation
sebvita est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2007, 14h01   #7
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Tsss Tsss. Ca tu peux y arriver tout seul :
Code :
1
2
3
contenu_fic := UTL_FILE.FOPEN(nom_rep, nom_fic, 'r');
UTL_FILE.GET_LINE ('contenu_fic', 'ligne_fic', TRUE);
UTL_FILE.FCLOSE(contenu_fic);
Y'a des ' qui sont en trop !
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2007, 17h05   #8
Invité de passage
 
Inscription : décembre 2005
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 6
Points : 1
Points : 1
Envoyer un message via MSN à sebvita
C'est bon, ça fonctionne.
Au cas où quelqu'un chercherait la réponse à ce topic, voici le script "définitif" qui fonctionne.

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
SET SERVEROUTPUT ON
 
CREATE DIRECTORY FICHIERS_IN AS 'C:\scripts';
GRANT READ ON DIRECTORY FICHIERS_IN TO PUBLIC;
/
 
CREATE OR REPLACE PROCEDURE	fic_ouv (nom_rep VARCHAR2, nom_fic VARCHAR2)
IS
ligne_fic VARCHAR2(32767);
contenu_fic UTL_FILE.file_type;
BEGIN
contenu_fic := UTL_FILE.FOPEN(nom_rep, nom_fic, 'r', 32764);
LOOP
BEGIN
UTL_FILE.GET_LINE (contenu_fic, ligne_fic);
DBMS_OUTPUT.PUT_LINE(ligne_fic);
EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE(contenu_fic);
EXIT;
END;
END LOOP;
END;
/
 
EXECUTE fic_ouv ('FICHIERS_IN', 'test.txt');
/
Merci à tous pour votre aide
sebvita 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 04h22.


 
 
 
 
Partenaires

Hébergement Web