Как преобразовать 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
→ Ссылка