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

Oracle Discussion :

Export CLOB dans fichier texte


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 35
    Par défaut Export CLOB dans fichier texte
    Bonjour,

    J'ai un soucis pour extraire un CLOB dans un fichier texte. Ce clob contient un flux XML (pas de possibilité de modifier le type de la colonne, cela doit rester un CLOB et pas de BLOB). J'ai essayé mult bout de code trouvé sur internet. J'arrive a exporter un clob d'une taille inférieure à 32K mais dès que cette taille est dépassé, mon script tombe KO. Je pense au buffer qui ne doit pas dépassé 32767 mais je bloque.

    Auriez vous une solution pour parcourir ce CLOB > 32K pour le mettre dans ce fichier texte. Ce CLOB doit être contenu sur une ligne est pas deux.

    Pour information, je ne peux pas utiliser DBMS_XSLPROCESSOR.

    Merci d'avance

    Damien

  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
    Qu'entendez-vous par cette phrase :
    Citation Envoyé par Hurricae Voir le message
    Ce CLOB doit être contenu sur une ligne est pas deux.
    Sur un besoin similaire (export d'un XML), j'utilise quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    declare
        v$_sel_clob    CLOB;
     
    begin
        select XMLElement("Balise", 'Contenu').getClobVal() into v$_sel_clob
          from dual;
     
        DBMS_XSLPROCESSOR.CLOB2FILE(v$_sel_clob, 'TST', 'Fichier_XML.xml');
    end;
    /
    Testé avec succès à l'instant sur une 11gR1.

    Pourquoi ne pouvez-vous pas utiliser DBMS_XSLPROCESSOR ?

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611

  4. #4
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 35
    Par défaut
    je ne peux pas utiliser DBMS_XSLPROCESSOR car il n'est pas installé sur la base (Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production)


    L'exemple d'export CLOB contents ne fonctionne pas non plus, j'obtiens :
    ERREUR à la ligne 1 :
    ORA-29285: erreur d'écriture sur le fichier
    ORA-06512: à "SYS.UTL_FILE", ligne 77
    ORA-06512: à "SYS.UTL_FILE", ligne 690
    ORA-06512: à ligne 21
    ORA-01403: aucune donnée trouvée

    Je précise que j'appel mon script via sqlplus.

    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
    whenever sqlerror exit 1
    whenever oserror exit 1
    SET SERVEROUTPUT ON
    SET HEAD OFF
    SET ECHO ON
    SET FEED 0
    SET VERIFY OFF
    SET SERVEROUTPUT ON
     
    DECLARE
      l_file    UTL_FILE.FILE_TYPE;
      l_clob    CLOB;
      l_buffer  VARCHAR2(32767);
      l_amount  BINARY_INTEGER := 32767;
      l_pos     INTEGER := 1;
    BEGIN
     
    SELECT LIGFOR INTO l_clob FROM EXTMVTACT WHERE IDNACT = 'ACTE_10010000123';
     
      l_file := UTL_FILE.fopen('DMPDIR', 'Sample2.txt', 'w', 32767);
     
      LOOP
        DBMS_LOB.read (l_clob, l_amount, l_pos, l_buffer);
        UTL_FILE.put(l_file, l_buffer);
        l_pos := l_pos + l_amount;
      END LOOP;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        -- Expected end.
        UTL_FILE.fclose(l_file);
      WHEN OTHERS THEN
        UTL_FILE.fclose(l_file);
        RAISE;
    END;
    /
    EXIT 0;
    Pour info, 'DMPDIR' existe bien et ce script fonctionne pour un clob plus petit que 32k

  5. #5
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Voilà
    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
    57
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> create table tab1 (
      2    col1 clob
      3  )
      4  /
     
    Table created
    SQL> Declare
      2    lob_loc   Clob;
      3  Begin
      4    insert into tab1(col1)
      5    values (empty_clob)
      6    returning col1 into lob_loc;
      7    --
      8    dbms_lob.write(lob_loc, 32767, 1, lpad('x',32767,'x'));
      9    dbms_lob.writeappend(lob_loc, 32767, lpad('y',32767,'y')) ;
     10    --
     11    commit;
     12  end;
     13  /
     
    PL/SQL procedure successfully completed
    SQL> Declare
      2    l_file    UTL_FILE.FILE_TYPE;
      3    l_clob    CLOB;
      4    l_buffer  Varchar2(32767);
      5    l_amount  BINARY_INTEGER := 32767;
      6    l_pos     INTEGER := 1;
      7  BEGIN
      8    SELECT col1
      9    INTO   l_clob
     10    FROM   tab1
     11    WHERE  rownum = 1;
     12  
     13    l_file := UTL_FILE.fopen('MRS_DOC', 'Sample2.txt', 'wb', 32767);
     14    LOOP
     15      DBMS_LOB.read( l_clob, l_amount, l_pos, l_buffer);
     16      UTL_FILE.put_raw(l_file, utl_raw.cast_to_raw(l_buffer));
     17      l_pos := l_pos + l_amount;
     18    END LOOP;
     19  EXCEPTION
     20    WHEN NO_DATA_FOUND THEN
     21      -- Expected end.
     22      UTL_FILE.fclose(l_file);
     23    WHEN OTHERS THEN
     24      UTL_FILE.fclose(l_file);
     25      RAISE;
     26  END;
     27  /
     
    PL/SQL procedure successfully completed
     
    SQL>

  6. #6
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 35
    Par défaut
    Merci beaucoup cela fonctionne! Vraiment sympa!

    Maintenant je bloque sur un problème tout bête mais qui me bloque pas mal. Le script fonctionne pour un clob, mais je dois en inscrire plusieurs (un clob par ligne), et la je bloque.

    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
     
    declare 
     
    l_file    UTL_FILE.FILE_TYPE;
    l_clob    CLOB;
    l_buffer  Varchar2(32767);
    l_amount  BINARY_INTEGER := 32767;
    l_pos     INTEGER := 1;
    leen   NUMBER;
     
    CURSOR C1 IS
        select LIGFOR, IDNACT
        from EXTMVTACT WHERE DATFRAI <= sysdate;
     
    begin
     
    OPEN C1;
     
     
    LOOP
        FETCH C1
          INTO l_clob;
        EXIT WHEN C1%NOTFOUND;
     
        l_file := UTL_FILE.fopen('DMPDIR', 'toto.txt', 'wb', 32767);
     
     
        leen := dbms_lob.getlength(l_clob);
        dbms_output.put_line('Column Length: ' || TO_CHAR(leen));
     
         LOOP
           DBMS_LOB.READ(l_clob, l_amount, l_pos, l_buffer);
           UTL_FILE.put_raw(l_file, utl_raw.cast_to_raw(l_buffer));
           l_pos := l_pos + l_amount;
            IF l_pos >= leen THEN
             GOTO sortie;
            END IF;
         END LOOP;
         <<sortie>>
         l_pos :=1;
         l_buffer := NULL;
    END LOOP;
    CLOSE C1;
     
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
           -- Expected end.
           UTL_FILE.fclose(l_file);
         WHEN OTHERS THEN
           UTL_FILE.fclose(l_file);
           RAISE;
    end;
    J'ai utilisé un curseur mais je ne suis pas sur de moi. De plus je ne sais pas si UTL_FILE va passer à la ligne automatiquement à la fin d'un CLOB

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 23/09/2011, 18h24
  2. Script pour exporter des données dans fichier texte
    Par dionmaxime dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/03/2011, 05h18
  3. [QLI] exporter le résultat dans fichier texte ?
    Par SurfingJeff dans le forum Outils
    Réponses: 2
    Dernier message: 17/03/2009, 13h06
  4. Exports de chaînes de caractère dans fichier texte
    Par Stormy31 dans le forum Langage
    Réponses: 4
    Dernier message: 29/01/2009, 13h31
  5. Problème d'exportation d'un clob dans fichier XML
    Par Fredifredo dans le forum SQL
    Réponses: 4
    Dernier message: 07/03/2007, 13h18

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