sql >> データベース >  >> RDS >> Oracle

BLOBforWorkまたはExcelファイル内の文字列を検索して置換します

    Microsoft WordおよびExcelファイルは、テキストを置き換えることができるテキストファイルではなく、BLOBでは確実に機能しません。 。 docx およびxlsx ファイルは実際には、ドキュメントのXML定義を含むzipファイルです(ファイル拡張子を変更して解凍してみてください)。したがって、次のことを行う必要があります。

    1. ファイルを解凍します
    2. 変更が必要なファイルをBLOBから変換します CLOB
    3. 適切なXMLファイルの内容を変更する
    4. ファイルをBLOBに変換し直します CLOBから
    5. 変更したファイルをzipファイルに追加し直します

    docx を置き換える方法の例として、以下のコードを記述しました。 ファイル。 xlsxの場合 ファイルの場合、各Excelシートは異なるXMLファイルに含まれているため、両方のファイルタイプで機能させるには、コードを少し変更する必要があります。

    コードは APEX_ZIP zipファイルの操作を大幅に簡素化し、サンプルコードで何が起こっているのかを少し明確にするパッケージ。 APEXがインストールされていない場合は、お持ちのOracleパッケージを使用してファイルを解凍/再解凍する方法を理解する必要があります。

    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. Magicbricksは大量のトラフィックをサポートするためにMariaDBに移行します

    2. Oracleでタイムスタンプの違いを見つける方法は?

    3. PHPの要約について尋ねる01+01 =02

    4. Oracleで日付が00/00/00000:000:00の行を選択して更新します