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

91

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

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

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

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

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

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

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

Теги:
blob

9 ответов

114
Лучший ответ

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

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

select utl_raw.cast_to_varchar2(dbms_lob.substr(BLOB_FIELD)) from TABLE_WITH_BLOB where ID = '<row id>';
  • 3
    К сожалению, я не контролирую схему базы данных - мне просто нужно заглянуть в блоб ... Но все равно спасибо.
  • 0
    Спасибо Mac, это прекрасно работает --- Но какова цель этого "dbms_lob.substr"? --- Только использование "select utl_raw.cast_to_varchar2 (BLOB_FIELD) ...", кажется, дает мне тот же результат ...?
Показать ещё 4 комментария
11

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

SELECT DBMS_LOB.SUBSTR(BLOB_FIELD_NAME) FROM TABLE_NAME;
5

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

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
    что здесь my_id?
  • 0
    @anjanb - это ключ для строки, которую вы хотите прочитать
3

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

Изображение 7144

1

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

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

SQL Developer также предоставляет эту функциональность:

Дважды щелкните ячейку сетки результатов и нажмите "Изменить":

Изображение 7145

Затем в верхней правой части всплывающего окна "Просмотр как текст" (вы даже можете увидеть изображения..)

Изображение 7146

И это!

Изображение 7147

0

Работал для меня,

(вставка (вставка (hex (BLOB_FIELD), 9,0, '-'), 14,0, '-'), 19,0, '-'), 24,0, '- '))) как FIELD_ID от TABLE_WITH_BLOB, где ID =' row id ';

0

Вы можете попробовать следующее:

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

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

-5

Используйте функцию TO_CHAR.

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

Преобразует данные NCHAR, NVARCHAR2, CLOB или NCLOB в набор символов базы данных. Возвращаемое значение всегда VARCHAR2.

  • 7
    К сожалению, это не работает для больших двоичных объектов, как просили.
  • 0
    ВЫБЕРИТЕ DBMS_LOB.SUBSTR (BLOB_FIELD) ОТ TABLE_WITH_BLOB;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню