Как получить текстовое содержимое из BLOB в Oracle SQL



Я пытаюсь увидеть из консоли SQL, что находится внутри большого двоичного объекта Oracle.



Я знаю, что он содержит несколько большой объем текста, и я хочу просто увидеть текст, но следующий запрос указывает только на то, что в этом поле есть BLOB:



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


результат я получаю не совсем то, что я ожидал:




BLOB_FIELD
-----------------------
oracle.sql.BLOB@1c4ada9


Итак, какие магические заклинания я могу сделать, чтобы превратить BLOB в его текстовое представление?



PS: Я просто пытаюсь посмотрите на содержимое большого двоичного объекта из консоли SQL (Eclipse Data Tools), а не используйте его в коде.

1521   7  

7 ответов:

прежде всего, вы можете хранить текст в Столбцах CLOB/NCLOB вместо BLOB, который предназначен для двоичных данных (Кстати, Ваш запрос будет работать с CLOB).

следующий запрос позволит вам увидеть первые 32767 символов (не более) текста внутри большого двоичного объекта, при условии, что все наборы символов совместимы (исходный CS текста, хранящегося в большом двоичном объекте, CS базы данных, используемой для VARCHAR2):

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

вы можете использовать ниже SQL для чтения полей BLOB из таблицы.

SELECT DBMS_LOB.SUBSTR(BLOB_FIELD_NAME) FROM TABLE_NAME;

Если вы хотите искать внутри текста, а не просматривать его, это работает:

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;

Я некоторое время боролся с этим и реализовал решение PL/SQL, но позже понял, что в Toad вы можете просто дважды щелкнуть по ячейке сетки результатов, и он вызывает редактор с содержимым в тексте. (я на жабе v11)

enter image description here

ответ Барна работал для меня с модификацией, потому что моя колонка не сжимается. Быстрое и грязное решение:

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

вы можете попробовать это:

SELECT TO_CHAR(dbms_lob.substr(BLOB_FIELD, 3900)) FROM TABLE_WITH_BLOB;

однако, это будет ограничено 4000 байт

использовать

Comments

    Ничего не найдено.