Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 16/05/2011, 10h29   #1
Invité de passage
 
Inscription : juillet 2008
Messages : 16
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 16
Points : 2
Points : 2
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
abdrx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 10h47   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
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 :
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•÷"
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 10h51   #3
Invité de passage
 
Inscription : juillet 2008
Messages : 16
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 16
Points : 2
Points : 2
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 ...
abdrx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 11h54   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
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!
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 12h01   #5
Invité de passage
 
Inscription : juillet 2008
Messages : 16
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 16
Points : 2
Points : 2
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 :
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 :
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;
/
abdrx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 14h53   #6
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
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 :
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>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/05/2011, 15h08   #7
Invité de passage
 
Inscription : juillet 2008
Messages : 16
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 16
Points : 2
Points : 2
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 ???
abdrx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 15h41   #8
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
C'est ça! Faite un od -h <nom_fich> pour l'afficher en Hexa.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h59.


 
 
 
 
Partenaires

Hébergement Web