IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

PL/SQL : exception à l'utilisation de UTL_FILE


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 5
    Par défaut PL/SQL : exception à l'utilisation de UTL_FILE
    Bonjour à tous et d'avance merci à ceux qui pourront m'aider.

    Dans le cadre de mon travail, je dois réaliser l'extraction de certains champs d'une dizaine de table de base de données au format csv (ou txt).

    Je pensais tout d'abord utiliser le package dbms_output, mais celui-ci borne la longueur des lignes à 255 caractères. Or, mes lignes dépassent allègrement les 300/400 caractères, et je n'ai pas trouvé de moyen pour augmenter cette taille.
    Je me suis donc rabattu sur un package que je n'ai encore jamais utilisé, mais dont j'avais entendu parler : UTL_FILE.

    Celui-ci semble permettre des lignes de 1000 caractères, mais malheureusement j'ai une exception à l'exécution.


    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    spool C:\Extraction\clients.log
     
    Set linesize 10000
    set feedback off
    set flush off
    set heading off
    set headsep off
    set timing off
    set pagesize 0
    set recsep off
    set termout off
    set trimspool on
    set verify off
    set wrap on
    set pause off
    set serveroutput on
     
    DECLARE     
    	handle UTL_FILE.FILE_TYPE ;
    	chaine varchar2(30) := 'test écriture';
    	ouvert boolean;
    	excep  exception;
            message varchar2(50);
            repertoire Varchar(30)   := 'C:\Extraction';
            fichier varchar(30) := 'test.txt';
     
    BEGIN
     
    	begin
    		handle := UTL_FILE.FOPEN(repertoire, fichier, 'W', 32764);
    		Exception
    		When OTHERS Then
    			message := sqlerrm;
                            raise excep;
    		ouvert := UTL_FILE.IS_OPEN( handle );
    		-- Petit test "alacon"
                    if ouvert = true then
    		  dbms_output.put_line('fichier ouvert ');
    		else
    		  dbms_output.put_line('fichier non ouvert ');
    		end if;
        End;
     
     
    	UTL_FILE.PUT_LINE( handle, chaine ) ;
    	UTL_FILE.FCLOSE( handle ) ;
     
    Exception
       When excep Then
         UTL_FILE.FCLOSE_ALL ;
         RAISE_APPLICATION_ERROR( -20100, message ) ;
     
    END;
    /
    spool off
    exit

    Et voici l'exception que j'obtiens :

    DECLARE
    *
    ERROR at line 1:
    ORA-20100: User-Defined Exception
    ORA-06512: at line 33

    La ligne 33 est bien évidemment la ligne correspondant à mon RAISE_APPLICATION_ERROR.
    Je n'arrive pas d'une part à savoir ce que signifie cette exception, et encore moins à la résoudre.

    J'espère que vous pourrez m'aider.

    PS : je suis sous Oracle 9I

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Est-ce que votre répertoire est bien déclaré dans le paramètre utl_file_dir de votre .ini ?

  3. #3
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Vous masquez la véritable erreur avec votre block exception.
    Avec une 9i, il est conseillé de passer par les DIRECTORIES.

  4. #4
    Futur Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 5
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Est-ce que votre répertoire est bien déclaré dans le paramètre utl_file_dir de votre .ini ?
    Je n'ai aucun paramètre utl_file_dir dans mon fichier init.ora (ce n'est pas moi qui gère l'installation d'oracle, mais une autre équipe).
    Est-ce qu'il suffit que je rajoute une ligne comme celle_ci : utl_file_dir = C:\Extraction ?



    Citation Envoyé par SheikYerbouti
    Vous masquez la véritable erreur avec votre block exception.
    Avec une 9i, il est conseillé de passer par les DIRECTORIES.
    J'ai lu votre doc sur le UTL_FILE (http://sheikyerbouti.developpez.com/...e=Chap8#L8.2.5) et j'ai essayé de créer un DIRECTORY (puis de donner les droits d'écriture) puis de l'utiliser dans mon script, et cette exception se lançait tout de même.

  5. #5
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Juste pour info, Les DIRECTORIES sont stockées en majuscules dans la vue ALL_DIRECTORIES, donc ça ne fonctionnera pas si vous saisissez dans votre code la DIRECTORY en minuscules.

  6. #6
    Futur Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 5
    Par défaut
    Citation Envoyé par SheikYerbouti Voir le message
    Juste pour info, Les DIRECTORIES sont stockées en majuscules dans la vue ALL_DIRECTORIES, donc ça ne fonctionnera pas si vous saisissez dans votre code la DIRECTORY en minuscules.

    Effectivement, je saisissais la DIRECTORY en minuscules.
    J'ai donc refait le test.

    Voici la création de ma DIRECTORY :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE DIRECTORY FICHIERS AS 'C:\EXTRACTION';
    GRANT READ, WRITE ON DIRECTORY FICHIERS TO PUBLIC;
    Apparemment, il n'y a pas eu de problèmes ici, ma fenêtre SQL m'a confirmé la création.

    J'ai ensuite modifié mon script pour utiliser cette DIRECTORY en me basant sur votre tutorial :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    spool C:\Extraction\clients.log
     
    DECLARE     
    	handle UTL_FILE.FILE_TYPE ;
    	chaine varchar2(30) := 'test écriture';
                      message varchar2(50);
                     repertoire Varchar(30)   := 'FICHIERS';
                     fichier varchar(30) := 'TEST.TXT';
                      except exception;
     
    BEGIN
     
    	begin
    		handle := UTL_FILE.FOPEN(repertoire, fichier, 'W', 32764);
    		Exception
        		  When OTHERS Then
    		  message := SQLERRM || ' [' || repertoire || '] -> ' || fichier;
    		  Raise except;
     
     
       	 End;
     
     
    	UTL_FILE.PUT_LINE( handle, chaine ) ;
    	UTL_FILE.FCLOSE( handle ) ;
     
    Exception
       When except Then
         UTL_FILE.FCLOSE_ALL ;
         RAISE_APPLICATION_ERROR( -20100, message ) ;
     
     
    END;
    /
    spool off
    exit

    A noter que ce script est lancé par un batch, car j'aurais plusieurs extractions à faire.

    Le script est appelé par l'instruction suivante :



    A l'exécution, j'ai désormais une autre exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE
    *
    ERROR at line 1:
    ORA-20100: User-Defined Exception [FICHIERS] -> TEST.TXT 
    ORA-06512: at line 28
    En espérant que l'un d'entre vous saura me dire pourquoi ...

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    A vérifier, mais vous avez donnez les droits au user PUBLIC, est-ce que vous vous connectez avec ce compte-ci (je ne suis pas sûr que les droits se propagent à tous les users) ?

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par NicolasC Voir le message
    Je n'ai aucun paramètre utl_file_dir dans mon fichier init.ora (ce n'est pas moi qui gère l'installation d'oracle, mais une autre équipe).
    Est-ce qu'il suffit que je rajoute une ligne comme celle_ci : utl_file_dir = C:\Extraction ?.
    Pour attaquer un fichier par utl_file, il faut soit passer par un DIRECTORY, soit par le paramètre utl_file_dir.

    Mais comme le précise SheikYerbouti c'est beaucoup plus avantageux de passer par les objets DIRECTORIES.
    Modifier le .ini vous oblige à redémarrer votre base, ce n'est pas très souple !

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/01/2006, 14h18
  2. SQL normalisé OU SQL Access ... Lequel utiliser ... ?
    Par snoopy69 dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 29/11/2005, 16h09
  3. Réponses: 2
    Dernier message: 08/11/2005, 10h38
  4. [Struts]Sql Exceptions error
    Par Oby dans le forum Struts 1
    Réponses: 2
    Dernier message: 20/02/2005, 17h49
  5. [JDBC] SQL Exception lors d'une Query !
    Par Castagnems dans le forum JDBC
    Réponses: 5
    Dernier message: 30/04/2004, 12h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo