Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

कार्य या एक्सेल फ़ाइल के लिए BLOB के अंदर स्ट्रिंग ढूंढें और बदलें

माइक्रोसॉफ्ट वर्ड और एक्सेल फाइलें टेक्स्ट फाइल नहीं हैं जिन्हें आप सिर्फ टेक्स्ट को बदल सकते हैं और यह निश्चित रूप से BLOB के साथ काम नहीं करेगा। . docx और xlsx फ़ाइलें वास्तव में ज़िप फ़ाइलें हैं (फ़ाइल एक्सटेंशन को बदलने और स्वयं को देखने के लिए अनज़िपिंग करने का प्रयास करें) जिसमें दस्तावेज़ की XML परिभाषा होती है। तो आपको यह करना होगा:

  1. फ़ाइल को अनज़िप करें
  2. उस फ़ाइल को कनवर्ट करें जिसे BLOB से बदलने की आवश्यकता है एक CLOB . के लिए
  3. उचित XML फ़ाइल की सामग्री को संशोधित करें
  4. फ़ाइल को वापस BLOB में बदलें एक CLOB . से
  5. संशोधित फ़ाइल को वापस ज़िप फ़ाइल में जोड़ें

मैंने नीचे दिए गए कोड को एक उदाहरण के रूप में लिखा है कि कैसे एक docx . का प्रतिस्थापन किया जाए फ़ाइल। xlsx . के लिए फाइलें, प्रत्येक एक्सेल शीट एक अलग एक्सएमएल फाइल में समाहित है, इसलिए आपको कोड को थोड़ा संशोधित करने की आवश्यकता होगी ताकि यह दोनों फाइल प्रकारों के साथ काम कर सके।

कोड APEX_ZIP पैकेज जो ज़िप फ़ाइलों के साथ काम करना बहुत सरल करता है और उदाहरण कोड को थोड़ा स्पष्ट करता है कि क्या हो रहा है। यदि आपके पास एपेक्स स्थापित नहीं है, तो आपको यह पता लगाने की आवश्यकता होगी कि आपके पास मौजूद 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या ऑरैकल अप्रतिबद्ध पठन विकल्प की अनुमति देता है?

  2. OracleDataAdapter.Fill () से डेटाटेबल को पॉप्युलेट करते समय निर्दिष्ट कास्ट मान्य नहीं है

  3. हम प्रक्रिया में IN पैरामीटर से VARRAY का मान कैसे प्राप्त कर सकते हैं?

  4. मैं SYS के स्वामित्व वाली वस्तुओं पर ट्रिगर क्यों नहीं बना सकता?

  5. ओरेकल में INITCAP () फ़ंक्शन