Не удается прочитать / открыть документ Word после преобразования из BLOB в CLOB (замена строки URL), затем преобразовать обратно в BLOB с помощью Oracle APEX

#oracle #replace #blob #oracle-apex #clob

#Oracle #заменить #большой двоичный объект #oracle-apex #clob

Вопрос:

У меня есть некоторый код, который преобразует большой двоичный объект документа word в большой двоичный объект, находит и заменяет URL-адрес, а затем преобразует обратно в большой двоичный объект с помощью APEX_ZIP.

Процедура выполняется нормально, но документ не открывается, поскольку он кажется поврежденным, когда я выполняю замену некоторого текста, когда большой двоичный объект преобразуется в формат CLOB, а затем обратно в BLOB.

Где я могу ошибаться, когда я делаю dbms_output, я не вижу никаких расхождений, так как строка, похоже, была заменена нормально.

 DECLARE
l_old_file       BLOB;
l_new_file       BLOB;
l_files          apex_zip.t_files;
l_document       BLOB;
l_clob           CLOB;
l_dest_offsset   INTEGER;
l_src_offsset    INTEGER;
l_lang_context   INTEGER := DBMS_LOB.default_lang_ctx;
l_warning        INTEGER;
BEGIN
    SELECT file_data
      INTO l_old_file
      FROM documents
     WHERE doc_no = '123';
l_files := apex_zip.get_files (l_old_file);

FOR i IN l_files.FIRST .. l_files.LAST
LOOP
    l_document := apex_zip.get_file_content (l_old_file, l_files (i));

    IF l_files (i) = 'word/document.xml'
    THEN
        -- if the file name is word/document.xml then make the changes to it
        
        DBMS_LOB.createTemporary (lob_loc => l_clob, cache => FALSE);

        l_dest_offsset := 1;
        l_src_offsset := 1;

        DBMS_LOB.converttoclob (dest_lob       => l_clob,
                                src_blob       => l_document,
                                amount         => DBMS_LOB.lobmaxsize,
                                dest_offset    => l_dest_offsset,
                                src_offset     => l_src_offsset,
                                blob_csid      => DBMS_LOB.default_csid,
                                lang_context   => l_lang_context,
                                warning        => l_warning);

        --------------------
        -- This is where you would do any replacements
        --------------------
        l_clob := REPLACE (l_clob, 'www.google.co.uk', 'www.google.com');
        --------------------

        l_dest_offsset := 1;
        l_src_offsset := 1;

        DBMS_LOB.CONVERTTOBLOB (dest_lob       => l_document,
                                src_clob       => l_clob,
                                amount         => DBMS_LOB.lobmaxsize,
                                dest_offset    => l_dest_offsset,
                                src_offset     => l_src_offsset,
                                blob_csid      => DBMS_LOB.default_csid,
                                lang_context   => l_lang_context,
                                warning        => l_warning);
    END IF;

    apex_zip.add_file (l_new_file, l_files (i), l_document);
END LOOP;

apex_zip.finish (l_new_file);


   update documents set file_data = l_new_file where doc_no = '123';  
   
END;
  

Большое спасибо,

Комментарии:

1. Какой у вас набор символов базы данных? Если вы посмотрите на файл XML, какой набор символов он указывает? Вы получаете сообщение об ошибке, если удаляете свой replace вызов?

2. Набор символов базы данных — AL32UTF8, я не получаю сообщение об ошибке, если удаляю вызов replace для переменной l_clob.