Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tìm và thay thế chuỗi bên trong BLOB for Work hoặc Tệp Excel

Các tệp Microsoft Word và Excel không phải là các tệp văn bản mà bạn chỉ có thể thay thế văn bản và điều đó chắc chắn sẽ không hoạt động với BLOB . docx xlsx tệp thực sự là tệp zip (hãy thử thay đổi phần mở rộng tệp và giải nén để tự xem) có chứa định nghĩa XML của tài liệu. Vì vậy, bạn sẽ cần:

  1. Giải nén tệp
  2. Chuyển đổi tệp cần thay đổi từ BLOB tới một CLOB
  3. Sửa đổi nội dung của tệp XML thích hợp
  4. Chuyển đổi tệp trở lại BLOB từ một CLOB
  5. Thêm lại tệp đã sửa đổi vào tệp zip

Tôi đã viết mã bên dưới làm ví dụ về cách thay thế thành docx tập tin. Đối với xlsx các tệp, mỗi trang tính Excel được chứa trong một tệp XML khác nhau, vì vậy bạn sẽ cần sửa đổi mã một chút để mã hoạt động với cả hai loại tệp.

Mã sử ​​dụng APEX_ZIP gói giúp đơn giản hóa đáng kể việc làm việc với các tệp zip và cũng làm cho mã ví dụ rõ ràng hơn một chút về những gì đang xảy ra. Nếu bạn chưa cài đặt APEX, bạn sẽ cần tìm cách giải nén / nén lại các tệp bằng các gói Oracle mà bạn có.

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. Hàm tổng hợp sản phẩm ()

  2. Oracle SqlPlus - lưu đầu ra trong một tệp nhưng không hiển thị trên màn hình

  3. Thả bảng khỏi cơ sở dữ liệu oracle nếu bảng tồn tại trong câu lệnh sql

  4. Truy vấn nhiều lần trong Oracle bằng perl chỉ trả về truy vấn đầu tiên

  5. Kết nối với cơ sở dữ liệu Oracle trong ứng dụng dotnet mvc