Oracle SQL: как получить HASH бинарных данных?

Задача возникла из практического вопроса:

некоторый набор данных реплицировали с девелоперского сервера на "боевой".

Потом я посмотрел, и мне показалось, что что то там не так.

Одно из полей - бинарные данные (типа byte[]).

И их я не могу посмотреть на продакшен - сервере!

Но там есть утилита, которая работает в браузере и на вход которой можно подать SQL запрос, а в результате она покажет первые 100 строк результата выполенния этого запроса.

Но при этом она нормально показывает числа и строки, но данные типа BLOB она показывает просто как надпись byte[] и ничего больше.

Но чтобы узнать, что данные типа BLOB перенеслись или не перенеслись - мне достаотчно проверить их хеш.

в MS SQL есть довольно удобный оператор HASHBYTES, который работает примерно так:

    SELECT Id, HASHBYTES('SHA2_256', BlobField) FROM dbo.TestTable;

В Oracle я первым делом попробовал ORA_HASH, но оказалось, что эта функция, вызванная на поле с одними и теми же данными, в разные моменты времени даёт разный результат! То сеть при каждом вызове

    SELECT "Id", "CreatedOn", "ModifiedOn", "ModifiedById", ORA_HASH("ObjectData") AS "Hash" FROM "SystemData" WHERE "Id"='{FADBAD11-032E-4555-9CFC-FB707EAAF87C}';

у меня Hash имеет разное значение.

Это у меня просто не укладывается в голове, поэтому и возник вопрос: есть ли какой то способ написать SQL запрос (без подключений пакетов и т.п., потому что веб интерфейс на продакшен - сервере даёт мне только возможность писать SQL запросы), и вывести в результате либо хеш (даже если это будет не очень хороший хеш, в котором иногда бывают коллизии - тоже годится!), либо бианрные данные, преобразованные к строке? Ну, типа функция "получить значение байта номер 6 из BLOB-поля".

Спасибо заранее!


Ответы (1 шт):

Автор решения: ESkri

есть ли какой то способ написать SQL запрос (без подключений пакетов и т.п., потому что веб интерфейс на продакшен - сервере даёт мне только возможность писать SQL запросы), и вывести в результате ... бианрные данные, преобразованные к строке?

select
utl_raw.cast_to_varchar2(dbms_lob.substr(TABLE.BLOB_COLUMN, LENGTH, OFFSET))
from TABLE where ...

Например, получить первые 4К байт блоба в виде строки:

utl_raw.cast_to_varchar2(dbms_lob.substr(TABLE.BLOB_COLUMN, 4000, 1))
→ Ссылка