sql - manejo - tipo de dato blob oracle
¿Cómo obtengo contenido textual de BLOB en Oracle SQL? (6)
Estoy tratando de ver desde una consola SQL qué hay dentro de un BLOB de Oracle.
Sé que contiene un cuerpo de texto algo grande y solo quiero ver el texto, pero la siguiente consulta solo indica que hay un BLOB en ese campo:
select BLOB_FIELD from TABLE_WITH_BLOB where ID = ''<row id>'';
el resultado que obtengo no es exactamente lo que esperaba:
BLOB_FIELD ----------------------- oracle.sql.BLOB@1c4ada9
Entonces, ¿qué tipo de conjuros mágicos puedo hacer para convertir el BLOB en su representación textual?
PD: Estoy tratando de ver el contenido del BLOB desde una consola SQL (Eclipse Data Tools), no usarlo en el código.
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 siguiente consulta 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 BLOB, CS de la base de datos utilizada para VARCHAR2):
select utl_raw.cast_to_varchar2(dbms_lob.substr(BLOB_FIELD)) from TABLE_WITH_BLOB where ID = ''<row id>'';
La respuesta de Barn funcionó para mí con modificaciones porque mi columna no está comprimida. 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;
Luché con esto por un tiempo e implementé la solución PL / SQL, pero más tarde me di cuenta de que en Toad puedes simplemente hacer doble clic en la celda de la cuadrícula de resultados, y aparece un editor con contenido en el texto. (Estoy en Toad v11)
Puede usar debajo de SQL para leer los campos BLOB de la tabla.
SELECT DBMS_LOB.SUBSTR(BLOB_FIELD_NAME) FROM TABLE_NAME;
Si desea buscar dentro del texto, en lugar de verlo, esto funciona:
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;
Use la función TO_CHAR
.
select TO_CHAR(BLOB_FIELD) from TABLE_WITH_BLOB where ID = ''<row id>''
Convierte datos NCHAR
, NVARCHAR2
, CLOB
o NCLOB
al conjunto de caracteres de la base de datos. El valor devuelto es siempre VARCHAR2
.