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 шт):
есть ли какой то способ написать 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))