138 votes

Comment obtenir des contenus textuels à partir de BLOB dans Oracle SQL

Je suis en train d'essayer de voir depuis une console SQL ce qui se trouve à l'intérieur d'un BLOB Oracle.

Je sais qu'il contient un corps de texte assez volumineux et je veux juste voir le texte, mais la requête suivante indique seulement qu'il y a un BLOB dans ce champ :

select BLOB_FIELD from TABLE_WITH_BLOB where ID = '';

le résultat que j'obtiens n'est pas tout à fait ce à quoi je m'attendais :

    BLOB\_FIELD
    -----------------------
    oracle.sql.BLOB@1c4ada9

Alors quel genre d'incantations magiques puis-je faire pour transformer le BLOB en sa représentation textuelle?

PS : Je suis juste en train de regarder le contenu du BLOB depuis une console SQL (Eclipse Data Tools), pas de l'utiliser dans du code.

166voto

Mac Points 4570

Tout d'abord, vous voudrez peut-être stocker du texte dans des colonnes CLOB/NCLOB au lieu de BLOB, qui est conçu pour les données binaires (votre requête fonctionnerait avec un CLOB, au fait).

La requête suivante vous permettra de voir les premiers 32767 caractères (au maximum) du texte à l'intérieur du blob, à condition que tous les jeux de caractères soient compatibles (CS d'origine du texte stocké dans le BLOB, CS de la base de données utilisée pour VARCHAR2) :

select utl_raw.cast_to_varchar2(dbms_lob.substr(BLOB_FIELD)) from TABLE_WITH_BLOB where ID = '';

5 votes

Malheureusement, je ne contrôle pas le schéma de la base de données - je dois juste jeter un œil dans le blob... Mais merci quand même.

0 votes

Merci Mac, ça fonctionne très bien --- Mais quelle est l'utilité de "dbms_lob.substr" ? --- Utiliser uniquement "select utl_raw.cast_to_varchar2(CHAMP_BLOB) ..." semble me donner le même résultat...?

5 votes

Cast_to_varchar2 prends un RAW en entrée (docs.oracle.com/cd/E11882_01/appdev.112/e25788/…), qui est limité à 32767 octets de longueur (docs.oracle.com/cd/E11882_01/appdev.112/e10472/…). Un BLOB n'a aucune limitation de taille, donc substr le tronque à la bonne taille (docs.oracle.com/cd/E11882_01/appdev.112/e25788/…) si nécessaire.

8voto

Barn Points 133

Si vous voulez rechercher à l'intérieur du texte, plutôt que de le visualiser, voici comment procéder :

with unzipped_text as (
  select
    mon_id
    ,utl_compress.lz_uncompress(mon_blob_comprimé) as mon_blob
  from ma_table
  where mon_id='MON_ID'
)
select * from unzipped_text
where dbms_lob.instr(mon_blob, utl_raw.cast_to_raw('CHAINE_DE_RECHERCHE'))>0;

0 votes

Quel est mon_id ici?

0 votes

Cela ne fonctionne pas pour moi, j'ai une colonne BLOB où les données XML sont compressées et stockées dans la table. Lorsque je lis les données, seuls quelques chiffres apparaissent et non le texte XML réel, que dois-je faire pour lire les données texte XML depuis la table.

4voto

Pecos Bill Points 469

La réponse de Barn a fonctionné pour moi avec une modification car ma colonne n'est pas compressée. La solution rapide et sale:

select * from my_table
where dbms_lob.instr(my_UNcompressed_blob, utl_raw.cast_to_raw('MY_SEARCH_STRING'))>0;

3voto

Sonic Soul Points 4562

J'ai eu du mal avec cela pendant un certain temps et j'ai mis en œuvre la solution PL/SQL, mais j'ai réalisé plus tard que dans Toad, vous pouvez simplement double-cliquer sur la cellule de la grille des résultats, ce qui ouvre un éditeur avec le contenu en texte. (je suis sur Toad v11)

saisissez ici la description de l'image

1voto

Gary Myers Points 24819

"un corps de texte quelque peu volumineux" C'est un peu vague. Voulez-vous dire juste des mots, ou s'agit-il de texte dans un document structuré (par exemple Word, PDF, HTML). Si c'est le dernier, regardez dans Oracle Text

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X