Как преобразовать CLOB с шестнадцатеричным кодом в BLOB?
Есть некоторое большое бинарное значение в шестнадцатеричной форме, хранящееся в CLOB колонке, и надо преобразовать его в BLOB, где шестнадцатеричный код является фактической двоичной кодировкой байтов:
DECLARE
-- это 8 байт в шестнадцатеричной форме, реальные данные значительно больше
c CLOB := 'cafebabe12345678';
b BLOB;
BEGIN
-- прототип функции
b := hex_to_blob(c);
END;
/
Какой есть простой способ сделать это в PL/SQL?
Свободный перевод вопроса Convert from hex-encoded CLOB to BLOB in Oracle от участника @Lukas Eder
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Пример реализации такой функции:
create or replace function hex2blob (hex clob) return blob is
val blob;
buf varchar2 (32767);
len int;
maxlen constant int := length (hex);
offs int := 1;
begin
dbms_lob.createtemporary (val, false);
while offs <= maxlen loop
len := 32767;
dbms_lob.read (hex, len, offs, buf);
offs := offs+len;
dbms_lob.append (val, to_blob (hextoraw (buf)));
end loop;
return val;
end hex2blob;
/
Пример, как использовать:
create table t (val blob)
/
declare
val blob;
begin
val := hex2blob ('cafebabe12345678');
insert into t values (val);
end;
/
select * from t;
VAL
----------------
CAFEBABE12345678