2009-05-06 14 views
85

Sto provando a vedere da una console SQL cosa c'è all'interno di un BLOB Oracle.Come ottengo il contenuto testuale da BLOB in Oracle SQL

So che contiene un po 'grande corpo di testo e voglio vedere solo il testo, ma la seguente query indica solo che c'è un BLOB in quel campo:

select BLOB_FIELD from TABLE_WITH_BLOB where ID = '<row id>'; 

il risultato sono ottenendo non è proprio quello che mi aspettavo:

 
    BLOB_FIELD 
    ----------------------- 
    [email protected] 

Quindi, che tipo di magia incantesimi che posso fare per trasformare il BLOB in esso è rappresentazione testuale?

PS: Sto solo cercando di guardare il contenuto del BLOB da una console SQL (Eclipse Data Tools), non usarlo nel codice.

risposta

104

Prima di tutto, è possibile memorizzare il testo nelle colonne CLOB/NCLOB anziché BLOB, che è progettato per i dati binari (la query dovrebbe funzionare anche con un CLOB).

La seguente query consente di visualizzare i primi 32767 caratteri (al massimo) del testo all'interno del BLOB, a condizione che tutti i set di caratteri siano compatibili (CS originale del testo memorizzato nel BLOB, CS del database utilizzato per VARCHAR2):

select utl_raw.cast_to_varchar2(dbms_lob.substr(BLOB_FIELD)) from TABLE_WITH_BLOB where ID = '<row id>'; 
+3

Purtroppo, non controllare lo schema del database - ho solo bisogno di sbirciare nel blob ... Ma grazie comunque. –

+0

Grazie Mac, funziona benissimo --- Ma qual è lo scopo di "dbms_lob.substr"? --- Usare solo "selezionare utl_raw.cast_to_varchar2 (BLOB_FIELD) ..." sembra darmi lo stesso risultato ...? – Rop

+4

cast_to_varchar2 accetta un input RAW (http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/u_raw.htm#autoId18), che è limitato a 32767 byte di lunghezza (http: // docs. oracle.com/cd/E11882_01/appdev.112/e10472/datatypes.htm#autoId8). Un BLOB non ha limiti di dimensioni, quindi il substr lo tronca a una dimensione corretta (http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_lob.htm#autoId57) se necessario. – Mac

-4

Utilizzare la funzione TO_CHAR.

select TO_CHAR(BLOB_FIELD) from TABLE_WITH_BLOB where ID = '<row id>' 

Converte NCHAR, NVARCHAR2, CLOB, o NCLOB dati al set di caratteri database. Il valore restituito è sempre VARCHAR2.

+7

Sfortunatamente, questo non funziona per i BLOB come richiesto. –

+0

SELECT DBMS_LOB.SUBSTR (BLOB_FIELD) FROM TABLE_WITH_BLOB; – Sambhav

5

Se si desidera effettuare la ricerca all'interno del testo, piuttosto che vederlo, questo funziona: risposta

with unzipped_text as (
    select 
    my_id 
    ,utl_compress.lz_uncompress(my_compressed_blob) as my_blob 
    from my_table 
    where my_id='MY_ID' 
) 
select * from unzipped_text 
where dbms_lob.instr(my_blob, utl_raw.cast_to_raw('MY_SEARCH_STRING'))>0; 
+0

cosa è my_id qui? – anjanb

+0

@anjanb - è la chiave per la riga che vuoi leggere – Barn

1

di Barn ha lavorato per me con la modifica perché la mia colonna non è compresso. La soluzione rapida e sporca:

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

ho lottato con questo per un po 'e ha implementato la soluzione PL/SQL, ma in seguito sono reso conto che in Toad si può semplicemente fare doppio clic sulla cella risultati della griglia, e si porta in primo piano un editor con contenuti nel testo. (Io sono su Toad v11)

enter image description here

10

per leggere i campi BLOB dalla tabella È possibile utilizzare sotto SQL.

SELECT DBMS_LOB.SUBSTR(BLOB_FIELD_NAME) FROM TABLE_NAME; 
Problemi correlati