Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour 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 07/04/2008, 12h23   #1
Invité de passage
 
Inscription : avril 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 14
Points : 1
Points : 1
Par défaut Ecriture dans un fichier || difficultés

Bonjour,

Je rencontre quelques problèmes pour écrire le résultat d'une requête dans un fichier . Voici mon code

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
   -- Test du package UTL_FILE
    --
    CREATE OR REPLACE PROCEDURE Test_util_file IS
      	ref_fichier UTL_FILE.FILE_TYPE;
	LC$Ligne    Varchar2(32767) ;
	LC$Requete	Varchar2(10000) ;
	TYPE REFCUR1 IS REF CURSOR ;
	 cur		REFCUR1;
    BEGIN
      ref_fichier := UTL_FILE.FOPEN('c:\julien','test.txt','w');
	LC$Requete := 'SELECT * FROM TABLE';
      Open cur FOR LC$Requete ;
  Loop
	Fetch cur INTO LC$Ligne ;
	Exit when cur%NOTFOUND ;
	-- Ecriture du fichier de sortie --
	  UTL_FILE.PUT_LINE( ref_fichier, LC$Ligne ) ;
	  UTL_FILE.PUT( ref_fichier, 'test2');
  End loop ;
 
  Close cur ;
      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
    /
Et l'appel de cette procédure >>
Code :
1
2
3
4
BEGIN 
test_util_file; 
END;
/
J'ai bien le fichier qui se crée, ainsi que le simple message test1, mais tout ce qui est dans la boucle (LOOP) ne s'écrit pas ...

Quelqu'un a t'il une idée ?
JuJuLaTordue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 12h31   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Il est où le test1 ??

Sinon, tu es sur de ta requête ?
Tu n'as qu'à l'afficher par un DBMS_OUTPUT, et aussi mettre un dbms_output dans le LOOP.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 13h48   #3
Invité de passage
 
Inscription : avril 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 14
Points : 1
Points : 1
Salut,
ah effectivement j'ai viré test1 que j'avais placé au dessus de la boucle, et ca l'écrivait bien dans le fichier ...

Apparemment c'est la boucle qui pose problème, pourtant la requête me retourne bien des résultats sous SQL*Plus ...

Pour ce qui est de DBMS_OUTPUT ya peut-être un problème

SQL> set serveroutput on
SQL> BEGIN
2 DBMS_OUTPUT.ENABLE( 1000000 ) ;
3 DBMS_OUTPUT.PUT( 'test');
4 END;
5 /

Procédure PL/SQL terminée avec succès.
JuJuLaTordue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 14h32   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Fais un PUT_LINE, avec que le PUT, la chaine reste dans le buffer et ne ressort pas automatiquement.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 14h54   #5
Invité de passage
 
Inscription : avril 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 14
Points : 1
Points : 1
Ca donne la meme chose c étrange
JuJuLaTordue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 15h07   #6
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Essayes avec la requête réelle (sans passer par des ' et avec un FOR LOOP)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 CREATE OR REPLACE PROCEDURE Test_util_file IS
  	ref_fichier UTL_FILE.FILE_TYPE;
	LC$Requete	VARCHAR2(10000) ;
BEGIN
    ref_fichier := UTL_FILE.FOPEN('c:\julien','test.txt','w');
 
    IF UTL_FILE.isopen(ref_fichier)
    THEN
        FOR r IN SELECT col1 ||';'||col2 AS ligne FROM TABLE;
        LOOP
            -- Ecriture du fichier de sortie --
            DBMS_OUTPUT.PUT_LINE('Ecriture ligne');
            UTL_FILE.PUT_LINE( ref_fichier, r.ligne ) ;
        END LOOP ;
 
          UTL_FILE.FFLUSH(ref_fichier);
          UTL_FILE.FCLOSE(ref_fichier);
     ELSE
        DBMS_OUTPUT.PUT_LINE('Fichier non créé');
     END IF; 
END;
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 16h50   #7
Membre expérimenté
 
Inscription : juillet 2007
Messages : 495
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2007
Messages : 495
Points : 585
Points : 585
Dans ta boucle, tu écris le contenu d'une variable (LC$Ligne) héritant du FETCH d'un SELECT *.
Je me demande si ce n'est pas trop imprécis au niveau du PUT_LINE. Est-ce que tu ne devrais pas spécifier les colonne dans le PUT_LINE : LC$Ligne .col1 || LC$Ligne .col3 ... ?
__________________
Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !
dgi77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 17h12   #8
Invité de passage
 
Inscription : avril 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 14
Points : 1
Points : 1
Salut,

Effectivement ma requête n'était pas assez précise

Je remercie McM pour m'avoir aiguiller dans le debuggage

Par contre, je n'ai pas résolu le non affichage via DBMS_OUTPUT, cela reste obscure.
JuJuLaTordue 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 19h17.


 
 
 
 
Partenaires

Hébergement Web