2017-02-02 33 views
2

У меня есть большое бинарное содержимое в шестнадцатеричной форме, хранящейся в CLOB и хочу, чтобы преобразовать его в BLOB, где шестнадцатеричный код актуален двоичные байты кодирование:Преобразовать из шестнадцатеричной кодировки CLOB для BLOB в Oracle

DECLARE 

    -- This would be my 8 byte hex-encoded binary content. Real content is much bigger 
    c CLOB := 'cafebabe12345678'; 
    b BLOB; 
BEGIN 

    -- Need the implementation of this function 
    b := hex_to_blob(c); 
END; 
/

Какой простой способ сделать это в Oracle, используя PL/SQL?

+1

Уважаемые @WernfriedDomscheit. Это функция переполнения стека, и это рекомендуется. Это рекомендуется, потому что это поможет всем будущим посетителям и платформе в целом. Я рекомендую это интересное: https://stackoverflow.blog/2011/07/its-ok-to-ask-and-answer-your-own-questions. Задайте вопрос и обратите внимание на «ответьте на свою собственную кнопку вопроса» внизу. Репутация - это приветственный побочный эффект, конечно. Привет, помощник. –

+1

@WernfriedDomscheit - Stack Overflow был создан, чтобы стать хранилищем больших вопросов и ответов. Самостоятельные ответы всегда разрешались и приветствуются. Мы даже позволяем людям публиковать вопрос и отвечать одновременно (см. Страницу [ask question] (http://stackoverflow.com/questions/ask) - есть возможность «ответить на свой собственный вопрос» по какой-то причине. – Oded

ответ

3

Желаемая функция может выглядеть следующим образом:

CREATE OR REPLACE 
FUNCTION hex_to_blob (hex CLOB) RETURN BLOB IS 
    b BLOB    := NULL; 
    s VARCHAR2(4000 CHAR) := NULL; 
    l NUMBER    := 4000; 
BEGIN 
    IF hex IS NOT NULL THEN 
    dbms_lob.createtemporary(b, FALSE); 

    FOR i IN 0 .. LENGTH(hex)/4000 LOOP 
     dbms_lob.read(hex, l, i * 4000 + 1, s); 
     dbms_lob.append(b, to_blob(hextoraw(s))); 
    END LOOP; 
    END IF; 

    RETURN b; 
END hex_to_blob; 
+0

typo: hex_to_clob -> hex_to_blob. Кроме того, почему 4000 где-то как постоянное и в другом месте как литерал? –

+0

Спасибо за упоминание опечатки. Исправлена. Переменная 'l' передается как значение' IN OUT NOCOPY' для ['dbms_lob. read'] (https://docs.oracle.com/database/121/ARPLS/d_lob.htm#ARPLS66738), поэтому нам нужна эта переменная. –

 Смежные вопросы

  • Нет связанных вопросов^_^