Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Temukan dan ganti string di dalam BLOB for Work atau File Excel

File Microsoft Word dan Excel bukan file teks yang hanya dapat Anda ganti teksnya dan yang pasti tidak akan berfungsi dengan BLOB . dokx dan xlsx file sebenarnya adalah file zip (coba ubah ekstensi file dan buka ritsleting untuk melihat sendiri) yang berisi definisi XML dokumen. Jadi, Anda perlu:

  1. Buka zip file
  2. Konversi file yang perlu diubah dari BLOB ke CLOB
  3. Ubah konten file XML yang sesuai
  4. Konversi file kembali ke BLOB dari CLOB
  5. Tambahkan file yang dimodifikasi kembali ke file zip

Saya telah menulis kode di bawah ini sebagai contoh tentang cara melakukan penggantian ke docx mengajukan. Untuk xlsx file, setiap lembar Excel terkandung dalam file XML yang berbeda sehingga Anda perlu sedikit memodifikasi kode agar berfungsi dengan kedua jenis file.

Kode tidak menggunakan APEX_ZIP paket yang sangat menyederhanakan bekerja dengan file zip dan juga membuat kode contoh sedikit lebih jelas tentang apa yang sedang terjadi. Jika Anda belum menginstal APEX, Anda perlu mengetahui cara melakukan unzip/rezip file menggunakan paket Oracle yang Anda miliki.

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
    -- Get the blob you want to "correct"
    SELECT blob_content
      INTO l_old_file
      FROM apex_application_temp_files
     WHERE ROWNUM = 1;

    -- Get a list of all the file names contained within the zip
    l_files := apex_zip.get_files (l_old_file);

    -- Loop through all the files adding each one to the new zip
    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);
    --Do whatever you want with the "new" file here
END;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Beberapa sisipan SQL oracle

  2. Oracle EXECUTE SEGERA ke dalam kursor

  3. Oracle:Perbedaan antara koneksi non-pooled dan DRCP

  4. Permintaan pembaruan berganda Oracle

  5. Oracle PLSQL setara dengan ASCIISTR(N'str')