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 :

Extraction BLOB en hexa


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 16
    Par défaut Extraction BLOB en hexa
    Bonjour a tous,

    On me fait la demande suivante :

    sur une base Oracle 9i, on veut extraire le contenu de tables.

    certaines de ces tables contiennent des BLOB.

    le client voudrait Un format SQL incluant les BLOBs en Hexa.

    Bon, deja, extraire un blob, j'ai trouvé.

    je genere un fichier soit avec UTL_FILE.put_raw, soit avec utl_file.put(l_file, UTL_RAW.CAST_TO_VARCHAR2(l_buffer) )

    quand je regarde le fichier generé, je vois bien le contenu (du texte).

    la ou je coince, c'est sur la demande : BLOBs en Hexa.

    alors la, je seche, je ne sais meme pas si demander cela est un non sens ou pas, et si c'est faisable, j'ai beau fouiller sur le net, je ne trouve rien.

    Merci de votre aide !

    JB

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Le Blob est stocké en hexa dans la base (il peut contenir des fichiers doc, vidéos, images, etc...), donc faire un export en hexa se comprend.

    Par contre la réinsertion devra se faire par programme (je ne pense pas qu'on puisse réinsérer un blob directement en sql.
    D'ailleurs, un BLOB pouvant faire 4 Go (ou plus suivant les versions de base), ce n'est pas un truc facilement utilisable derrière.

    exemple d'export d'une table de logos (en gif),n mais que les 20 premiers codes hexa
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT dbms_lob.substr(logo, 20,1) AS logo_hexa
    FROM param_logo
    WHERE ROWNUM < 5
     
    LOGO_HEXA
    "47494638396134039501F7000000000001010102"
    "47494638396134039501F70000000000FFFFFFD6"
    "4749463839616201FA00F7000000000001010102"
    "4749463839616201FA00F70000000000FFFFFFD2"
     
    ce qui correspond en clair (à peu près) pour la première ligne
    "GIF89a4•÷"

  3. #3
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 16
    Par défaut
    Ok, merci pour l'info sur le fait que le blob soit deja en hexa.

    le soucis ici est de reussir a extraire le blob dans un fichier, directement en HEXA ... comment dois je m'y prendre ?

    ca m'enerve, j'ai l'impression de buter sur un truc a la con, et j'aime pas ca ...

    Merci pour ton aide en tout cas ...

  4. #4
    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
    Citation Envoyé par abdrx Voir le message
    ...je genere un fichier soit avec UTL_FILE.put_raw, soit avec utl_file.put(l_file, UTL_RAW.CAST_TO_VARCHAR2(l_buffer) )

    quand je regarde le fichier generé, je vois bien le contenu (du texte).

    la ou je coince, c'est sur la demande : BLOBs en Hexa.
    ...
    Si vous utilisez put_raw et que vous avez correctement codé l'extraction du Blob, vous n'avez rien à faire: le fichier est en Hexa!

  5. #5
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 16
    Par défaut
    ALors :

    en utilisant put_raw, j'ai exactement la meme sortie qu'avec UTL_RAW.CAST_TO_VARCHAR2, a savoir un fichier lisible ...

    le fichier commence par =>

    "Form Information etc etc etc"


    par contre, si je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      SELECT dbms_lob.substr(content, 20, 1)
      FROM   FND_LOG_ATTACHMENTS
      where rownum = 1
    j'ai comme resultat : 466F726D20496E666F726D6174696F6E0A2D2D2D

    voici mon code (de test, je fais des essais) :

    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
     
    DECLARE
      l_file      UTL_FILE.FILE_TYPE;
      l_buffer    RAW(32767);
      l_amount    BINARY_INTEGER := 32767;
      l_pos       INTEGER := 1;
      l_blob      BLOB;
      l_blob_len  INTEGER;
      v_varchar   VARCHAR2(32767);
    BEGIN
      -- Get LOB locator
      SELECT content
      INTO   l_blob
      FROM   FND_LOG_ATTACHMENTS
      WHERE  rownum = 1;
      l_blob_len := DBMS_LOB.getlength(l_blob);
      dbms_output.put_line('Internal LOB size is:  ' || l_blob_len);
      -- Open the destination file.
      l_file := UTL_FILE.fopen('BLOBS','TEST.TXT','w', 32767);
      -- Read chunks of the BLOB and write them to the file
      -- until complete.
      WHILE l_pos < l_blob_len LOOP
        DBMS_LOB.read(l_blob, l_amount, l_pos, l_buffer);
        UTL_FILE.put_raw(l_file, l_buffer, TRUE);
        --utl_file.put(l_file, UTL_RAW.CAST_TO_VARCHAR2(l_buffer) );
        l_pos := l_pos + l_amount;
      END LOOP;  
      -- Close the file.
      UTL_FILE.fclose(l_file);
    EXCEPTION
      WHEN OTHERS THEN
        -- Close the file if something goes wrong.
        IF UTL_FILE.is_open(l_file) THEN
          UTL_FILE.fclose(l_file);
        END IF;
        RAISE;
    END;
    /

  6. #6
    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
    Le contenu de votre colonne blob est "lisible". Ouvrez le fichier généré avec un éditeur héxa et vous allez visualiser le même résultat que dbms_lob.substr
    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
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> create table mni_blob (
      2    contenu blob
      3  )
      4  /
     
    Table created
    SQL> insert into mni_blob values (utl_raw.cast_to_raw('Form Information'))
      2  /
     
    1 row inserted
    SQL> commit
      2  /
     
    Commit complete
    SQL> col a format a30
    SQL> col b format a30
    SQL> select UTL_RAW.CAST_TO_VARCHAR2(contenu) a,
      2         dbms_lob.substr(contenu, 20, 1) b
      3    from mni_blob
      4  /
     
    A                              B
    ------------------------------ ------------------------------
    Form Information               466F726D20496E666F726D6174696F
                                   6E
     
    SQL>

  7. #7
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 16
    Par défaut
    ok, merci pour la precision, si j'ai bien compris, le fichier generé est bien en HEXA, c'est l'editeur de texte (vi en l'occurence dans mon cas) qui me l'affiche, transcodé en ASCII ???

  8. #8
    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
    C'est ça! Faite un od -h <nom_fich> pour l'afficher en Hexa.

Discussions similaires

  1. Récupérer un Blob en Hexa.
    Par Jean-Jacques Engels dans le forum Bases de données
    Réponses: 6
    Dernier message: 12/12/2011, 17h20
  2. Extraction BLOB Oracle en image JPEG
    Par gueulederack dans le forum C#
    Réponses: 1
    Dernier message: 14/09/2011, 11h13
  3. Réponses: 12
    Dernier message: 06/11/2007, 15h17
  4. Extraction des valeurs hexa d'un champ char
    Par Krispi dans le forum Fortran
    Réponses: 3
    Dernier message: 21/11/2005, 11h10
  5. [INTERBASE] Extraction vers txt d'un blob
    Par FORESTIER dans le forum InterBase
    Réponses: 6
    Dernier message: 09/11/2004, 14h20

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