База данных Oracle: Как читать BLOB? - PullRequest
11 голосов
/ 16 апреля 2011

Я работаю с базой данных Oracle и хотел бы прочитать содержимое BLOB. Как мне это сделать?

Когда я делаю простой оператор выбора, он просто возвращает «(BLOB)» (без кавычек). Как я могу прочитать фактическое содержание?

Ответы [ 6 ]

8 голосов
/ 30 декабря 2013

Вы можете вывести значение в шестнадцатеричном виде, используя UTL_RAW.CAST_TO_RAW(UTL_RAW.CAST_TO_VARCHAR2()).

SELECT b FROM foo;
-- (BLOB)

SELECT UTL_RAW.CAST_TO_RAW(UTL_RAW.CAST_TO_VARCHAR2(b))
FROM foo;
-- 1F8B080087CDC1520003F348CDC9C9D75128CF2FCA49D1E30200D7BBCDFC0E000000

Это удобно, потому что этот формат используется для вставки в столбцы BLOB:

CREATE GLOBAL TEMPORARY TABLE foo (
    b BLOB);
INSERT INTO foo VALUES ('1f8b080087cdc1520003f348cdc9c9d75128cf2fca49d1e30200d7bbcdfc0e000000');

DESC foo;
-- Name Null Type 
-- ---- ---- ---- 
-- B        BLOB 

Однако в определенный момент (2000 байт?) Соответствующая шестнадцатеричная строка превышает максимальную длину строки Oracle. Если вам нужно разобраться с этим случаем, вам придется объединить Как получить текстовое содержимое из BLOB в Oracle SQL с документацией для DMBS_LOB.SUBSTR для более сложного подхода, который позволит вам увидеть подстроки BLOB.

7 голосов
/ 17 октября 2012

Разработчик SQL может показать BLOB-объект в виде изображения (по крайней мере, он работает для JPEG). В представлении данных дважды щелкните поле BLOB, чтобы получить значок «карандаш». Нажмите на карандаш, чтобы открыть диалоговое окно, которое позволит вам установить флажок «Просмотреть как изображение».

2 голосов
/ 17 августа 2012

Если вы используете собственный поставщик данных Oracle, а не драйвер Microsoft, тогда вы можете получить все типы полей

Dim cn As New Oracle.DataAccess.Client.OracleConnection
Dim cm As New Oracle.DataAccess.Client.OracleCommand
Dim dr As Oracle.DataAccess.Client.OracleDataReader

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

"Data Source=myOracle;UserID=Me;Password=secret"

Открыть соединение:

cn.ConnectionString = "Data Source=myOracle;UserID=Me;Password=secret"
cn.Open()

Присоединить команду и установить оператор Sql

cm.Connection = cn
cm.CommandText = strCommand

Установить размер выборки.Я использую 4000, потому что он такой же большой, как varchar, который может быть

cm.InitialLONGFetchSize = 4000

Запустите считыватель и прокрутите записи / столбцы

dr = cm.ExecuteReader

Do while dr.read()
    strMyLongString = dr(i)
Loop

Вы можете быть более конкретным с прочтением, напримерdr.GetOracleString (i) dr.GetOracleClob (i) и т. д., если вы сначала идентифицируете тип данных в столбце.Если вы читаете тип данных LONG, то простой dr(i) или dr.GetOracleString(i) работает нормально.Ключ должен гарантировать, что InitialLONGFetchSize достаточно большой для типа данных.Также обратите внимание, что собственный драйвер не поддерживает CommandBehavior.SequentialAccess для считывателя данных, но он вам не нужен, а также поле LONG даже не должно быть последним полем в операторе select.

2 голосов
/ 24 июня 2011

Если содержимое не слишком большое, вы также можете использовать

SELECT CAST ( <blobfield> AS RAW( <maxFieldLength> ) ) FROM <table>;

или

SELECT DUMP ( CAST ( <blobfield> AS RAW( <maxFieldLength> ) ) ) FROM <table>;

Это покажет вам значения HEX.

0 голосов
/ 04 ноября 2014

Если вы заинтересованы в получении открытого текста (части тела) от BLOB, вы можете использовать пакет CTX_DOC .

Например, процедура CTX_DOC.FILTER может «генерировать либо простой текст, либо HTML-версию документа». Помните, что для CTX_DOC.FILTER требуется указатель на столбец BLOB. Если вы не хотите этого, вы можете вместо этого использовать процедуру CTX_DOC.POLICY_FILTER, для которой не требуется индекс.

0 голосов
/ 16 апреля 2011

Каким клиентом вы пользуетесь? .Net, Java, Ruby, SQLPLUS, SQL РАЗРАБОТЧИК? Где вы написали это простое утверждение select?

А почему вы хотите прочитать содержимое большого двоичного объекта, большой двоичный объект содержит двоичные данные, поэтому данные не могут быть прочитаны. Вы должны использовать clob вместо blob, если вы хотите хранить текст вместо двоичного содержимого.

Я предлагаю вам скачать РАЗРАБОТЧИК SQL: http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html. С разработчиком SQL вы можете увидеть содержимое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...