2009-05-06 126 views
85

Estoy tratando de ver desde una consola SQL qué hay dentro de un BLOB de Oracle.Cómo obtengo contenido textual de BLOB en Oracle SQL

Sé que contiene una gran cantidad de un poco de texto y quiero ver sólo el texto, sino la siguiente consulta sólo indica que existe un BLOB en ese campo:

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

el resultado estoy consiguiendo no es exactamente lo que esperaba:

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

Entonces, ¿qué tipo de magia encantamientos puedo hacer para convertir el BLOB en su representación textual?

PD: Estoy tratando de ver el contenido del BLOB desde una consola SQL (herramientas de datos Eclipse), no usarlo en el código.

Respuesta

104

En primer lugar, es posible que desee almacenar texto en columnas CLOB/NCLOB en lugar de BLOB, que está diseñado para datos binarios (su consulta funcionaría con un CLOB, por cierto).

La consulta siguiente le permitirá ver los primeros 32767 caracteres (como máximo) del texto dentro del blob, siempre que todos los juegos de caracteres sean compatibles (CS original del texto almacenado en el BLOB, CS de la base de datos utilizada VARCHAR2):

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

Por desgracia, no controlo el esquema de base de datos - sólo hay que mirar en la mancha ... Pero gracias de todos modos. –

+0

Gracias Mac, eso funciona bien --- ¿Pero cuál es el propósito de ese "dbms_lob.substr"? --- Solo usando "select utl_raw.cast_to_varchar2 (BLOB_FIELD) ..." parece darme el mismo resultado ...? – Rop

+4

cast_to_varchar2 toma un RAW en la entrada (http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/u_raw.htm#autoId18), que está limitado a 32767 bytes de longitud (http: // docs. oracle.com/cd/E11882_01/appdev.112/e10472/datatypes.htm#autoId8). Un BLOB no tiene ninguna limitación de tamaño, por lo que substr lo trunca a un tamaño correcto (http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_lob.htm#autoId57) si es necesario. – Mac

-4

Utilice TO_CHAR function.

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

Convierte NCHAR, NVARCHAR2, CLOB o NCLOB datos para el conjunto de caracteres base de datos. El valor devuelto es siempre VARCHAR2.

+7

Desafortunadamente, esto no funciona para BLOB como se le pidió. –

+0

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

5

Si desea buscar dentro del texto, en lugar de verla, esto funciona: Respuesta

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

¿qué es my_id aquí? – anjanb

+0

@anjanb: es la clave de la fila que quieres leer – Barn

1

del granero trabajó para mí con la modificación porque mi columna no se comprime. La solución rápida y sucia:

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

Luché con esto durante un tiempo e implementó la solución de PL/SQL, pero más tarde di cuenta de que en sapo puede simplemente hacer doble clic en la celda de cuadrícula de resultados, y eso trae la editor con contenido en texto. (Estoy en v11 sapo)

enter image description here

10

Puede utilizar SQL para leer a continuación el BLOB Los campos de la tabla.

SELECT DBMS_LOB.SUBSTR(BLOB_FIELD_NAME) FROM TABLE_NAME; 
Cuestiones relacionadas