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 26/05/2006, 19h47   #1
Membre à l'essai
 
Inscription : avril 2003
Messages : 83
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 83
Points : 22
Points : 22
Par défaut pour commencer pl/sql et sql*plus

Bonjour,

Compètement nouveau sur oracle (mais avec qqs bases de SQL) j'ai besoin de votre aide pour commencer ...

Je travaille pour l'instant sur une oracleXE 10 G sous windows, en attendant la mise en place d'un serveur de prod.

J'ai besoin de générer un fichier texte issue de plusieurs tables générable seulement en PL/SQL

Q1 - donc je ne peux pas utiliser la commande SPOOL et SPOOL OFF, est ce exact ?


Ce fichier va attendre rapidement des gros volumes

Q2 - donc je dois utiliser
le package UTL_FILE, est-ce correct ?


J'ai récupéré ici http://gbriard.club.fr/technique/5.htm une procédure qui permet de tester ce package, mais j'ai de soucis avec ...

J'ai modifié le fichier init.ora pour ajouter

Le code suivant est sauvé dans le fichier test_utl_file.sql

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
 
    --
    -- Test du package UTL_FILE
    --
    CREATE OR REPLACE PROCEDURE Test_util_file IS
      ref_fichier UTL_FILE.FILE_TYPE;
    BEGIN
      ref_fichier := UTL_FILE.FOPEN('d:\test','resultat.txt','w');
      UTL_FILE.PUT_LINE(ref_fichier,'Première ligne...');
      UTL_FILE.PUT_LINE(ref_fichier,'C''est fini...');
      UTL_FILE.FFLUSH(ref_fichier);
      UTL_FILE.FCLOSE(ref_fichier);
    EXCEPTION
      -- traitement des erreurs rencontrees
      WHEN NO_DATA_FOUND THEN
          DBMS_OUTPUT.PUT_LINE ('Pas de donnée trouvée.');
          UTL_FILE.FCLOSE(ref_fichier);
      WHEN UTL_FILE.INVALID_PATH THEN 
          DBMS_OUTPUT.PUT_LINE ('UTL_FILE.INVALID_PATH invalide.');
          UTL_FILE.FCLOSE(ref_fichier);
      WHEN UTL_FILE.READ_ERROR THEN 
          DBMS_OUTPUT.PUT_LINE ('UTL_FILE.READ_ERROR invlide.');
          UTL_FILE.FCLOSE(ref_fichier);
      WHEN UTL_FILE.WRITE_ERROR THEN 
          DBMS_OUTPUT.PUT_LINE ('UTL_FILE.WRITE_ERROR invalide.');
          UTL_FILE.FCLOSE(ref_fichier);
      WHEN OTHERS THEN 
          DBMS_OUTPUT.PUT_LINE ('Autre erreur.');
          UTL_FILE.FCLOSE(ref_fichier);
    END; -- fin de la procedure
        -- le signe / execute la procedure sous SQL*Plus
    /
Lorsque je fait dans sql*plus
J'ai l'erreur suivante :
PLS-00201: l'identifiant test_utl_file doit être déclaré

Q3 - pourquoi ? La commande execute n'est elle pas capable de chercher le fichier test_utl_file ?


Depuis l'insterface web de oracleXE de colle le code de test_utl_file j'obtiens :
ERROR at line 0: PL/SQL/ Compilation unit analysis terminated


Q4 - Que cela signifie t'il ?
La procédure est bien crée, par contre elle est vide, ce qui est logique vue l'erreur rencontré ...

Je suis désolé pour toutes ces questions basiques, mais leur réponses (surtout pour la 3 et la 4) me permettront d'avancer avec les support pl/sql que j'ai pu récupérer ici et ailleurs.

D'avance merci
fpouget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2006, 18h39   #2
Membre à l'essai
 
Inscription : avril 2003
Messages : 83
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 83
Points : 22
Points : 22
Bonjour,

Je continue mes tests, mes ceux çi ne sont toujours pas concluants, il doit me manquer un truc basique, mais pour l'instant je séche ...

Je viens d'exécuter la même procédure que ci-dessus, mais allégé (en virant les retrictions)

Code :
1
2
3
4
5
6
7
8
9
10
CREATE OR REPLACE PROCEDURE Test_util_file IS
   ref_fichier UTL_FILE.FILE_TYPE;
BEGIN
   ref_fichier := UTL_FILE.FOPEN('d:\test','resultat.txt','w');
   UTL_FILE.PUT_LINE(ref_fichier,'Première ligne...');
   UTL_FILE.PUT_LINE(ref_fichier,'C''est fini...');
   UTL_FILE.FFLUSH(ref_fichier);
   UTL_FILE.FCLOSE(ref_fichier);
END;
/
Lorsque j'exécute cette procédure avec l'interface oracleXE 10G il m'indique que le package a été crée,mais qd je regarde mes procédures stockés celle-ci y est mais elle apparait vide.

Si j'essaye d'éxecuter cette procédure
Code :
1
2
3
4
BEGIN 
test_utl_file; 
END; 
/
J'ai l'erreur suivante :
PLS-00201: l'identifiant test_utl_file doit être déclaré


Savez-vous ou je me trompe ?
fpouget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2006, 19h19   #3
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
Après création de vos objets, utilisez l'instruction SHOW ERRORS pour voir les erreurs de compilation.
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2006, 01h03   #4
Membre à l'essai
 
Inscription : avril 2003
Messages : 83
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 83
Points : 22
Points : 22
Bonjour,

Je crois que j'ai voulu commencer trop fort avec tout ça, je laisse tomber pour l'instant.
J'ai tout de même une question dont j'imagine la réponse ultra simple :

Losque j'exécute ce code (trouvé sur le support PL/SQL ici http://sheikyerbouti.developpez.com/pl_sql/) avec sql*plus, la ligne 'Salut Monde' ne s'affiche pas, alors que j'ai un message comme quoi cela c'est exécuté convenablement ?

Code :
1
2
3
4
5
6
 
DECLARE
LC$Chaine VARCHAR2(15) := 'Salut Monde' ;
BEGIN
DBMS_OUTPUT.PUT_LINE( LC$Chaine ) ;
END ;
Merci
fpouget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2006, 09h46   #5
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
Par défaut, la sortie n'est pas activée.

il faut d'abord utiliser l'instruction
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2006, 10h01   #6
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Citation:
CREATE OR REPLACE PROCEDURE Test_util_file IS
Citation:
BEGIN
test_utl_file;
END;
PL/SQL ne fait pas la différence minuscules/majuscules pour les identifiants mais il sait quand même faire la différence s'il manque 1 seule lettre
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2006, 23h05   #7
Membre à l'essai
 
Inscription : avril 2003
Messages : 83
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 83
Points : 22
Points : 22
Citation:
Envoyé par pifor
PL/SQL ne fait pas la différence minuscules/majuscules pour les identifiants mais il sait quand même faire la différence s'il manque 1 seule lettre
La honte


Reste que j'ait toujours un problème avec UTL_FILE

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
CREATE OR REPLACE DIRECTORY FICHIERS AS 'd:\test';
GRANT READ ON DIRECTORY FICHIERS TO PUBLIC;
 
 
CREATE OR REPLACE PROCEDURE Test_util_file IS
   ref_fichier UTL_FILE.FILE_TYPE;
BEGIN
   ref_fichier := UTL_FILE.FOPEN(FICHIERS,'resultat.txt','w');
   UTL_FILE.PUT_LINE(ref_fichier,'Première ligne...');
   UTL_FILE.PUT_LINE(ref_fichier,'C''est fini...');
   UTL_FILE.FFLUSH(ref_fichier);
   UTL_FILE.FCLOSE(ref_fichier);
END;
/
Si je fait un SHOW ERRORS j'ai

Code :
1
2
3
4
 
2/10    PL/SQL: Item ignored
2/10    PLS-00201: l'identifiant 'UTL_FILE' doit être déclaré
...
Mais que faut'il faire pour utiliser UTL_FILE ? Il ya des déclarations à faire avant ? Je n'ai rienlu là-dessus ....
A moins que ma version de oracle soit limité, je suis avec une 10G mais oracleXE, mais pareil,je n'ai pas lu de restriction là-dessus !


Désolé d'être le boulet de service ... et merci pour le "set serveroutput on", cela marche mieux avec, c'est déjà ça ...
fpouget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2006, 02h14   #8
Membre à l'essai
 
Inscription : avril 2003
Messages : 83
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 83
Points : 22
Points : 22
Ben ma dernière intuition a été la bonne : c'est bien un pb de version, il semble que la versionXE d'Oracle ne contienne pas le package, ou alors il faut le paramétrer autrement, car avec Oracle "standard" cela marche parfaitement !

Voici mon code avec la 10g


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
 
 
-- connection system pour donner les droits aux repertoires
connect system/test
CREATE OR REPLACE DIRECTORY FICHIERS AS 'd:\test' ;
GRANT READ, WRITE ON DIRECTORY FICHIERS TO PUBLIC ;
 
-- connection user
connect scott/tiger
 
-- creation de la procedure
CREATE OR REPLACE PROCEDURE Test_utl_file IS
	ref_fichier UTL_FILE.FILE_TYPE;
	ref_rep Varchar(30) := 'FICHIERS'; 
BEGIN
	ref_fichier := UTL_FILE.FOPEN(ref_rep,'resultat.txt','w');
	UTL_FILE.PUT_LINE(ref_fichier,'Première ligne...');
	UTL_FILE.PUT_LINE(ref_fichier,'C''est fini...');
	UTL_FILE.FFLUSH(ref_fichier);
	UTL_FILE.FCLOSE(ref_fichier);
END;
/
 
-- execution de la procedure
execute Test_utl_file;
-- le fichier resultat.txt est crée :D
Si vous avez des conseils d'optimisations je suis preneur, je placerai le post en "resolu" dans la journée, et je n'aurai plus qu'a complêter le script ...
fpouget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2006, 06h26   #9
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
Le droit a été retiré sur PUBLIC avec la version XE.

Il faut le réaffecter manuellement:

Code :
1
2
3
4
5
6
7
SQL> conn sys/xx@xe AS sysdba
Connected.
SQL> GRANT execute ON UTL_FILE TO public;
 
GRANT succeeded.
 
SQL>
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2006, 21h41   #10
Membre à l'essai
 
Inscription : avril 2003
Messages : 83
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 83
Points : 22
Points : 22
Désolé pour cette raponse tardive, mais j'ai eu la mauvaise idée hier de changer mon adresse email, et comme je n'ai reçu le mél de confirmation qu'a l'instant, j'étais dans l'impossiblité de répondre ...

Bref merci pour cette info, à l'avenir pour éviter de galérer et de "polluer" le forum de mes questions de novices, ou est-ce que je peux trouver une telles information ?

Promis je marque bientôt ce post "Resolu" !
fpouget 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 12h31.


 
 
 
 
Partenaires

Hébergement Web