2013-06-03 3 views
7

मैं वर्तमान में एक प्रोजेक्ट पर काम शुरू कर रहा हूं जहां मुझे डेटाबेस में कई तालिकाओं के आधार पर बड़ी एक्सएमएल फाइलों को निर्यात करने के लिए कोड (पीएल/एसक्यूएल) लिखना होगा।ऑरैकल से बड़ी एक्सएमएल फाइलें उत्पन्न करना: सर्वोत्तम प्रथाओं

निर्यात फ़ाइलें काफी बड़ी हो सकती हैं और इसमें 700,000 ग्राहक (उनके पते, आदेश, टेलीफोन नंबर इत्यादि) शामिल हो सकते हैं।

मैं सोच रहा था कि किसी के पास इसके लिए सबसे अच्छा तरीका है या नहीं। मैं स्पष्ट रूप से उन में XMLELEMENTS के खोने के साथ चयन लिख सकता हूं, लेकिन इसका मतलब यह होगा कि पूरी फाइल स्मृति में उत्पन्न होगी।

एक एक्सएमएल स्कीमा (एक्सएसडी) भी उपलब्ध है जिसके लिए फाइलों का पालन करना है। मैं यह भी सोच रहा था कि एक्सएमएल स्कीमा में टेबल को "मैप" करने का कोई तरीका है या नहीं।

किसी भी सुझाव की सराहना की जाती है।

+0

dba.stackexchange.com –

+5

@ बुरहान खालिद असहमत के लिए बेहतर अनुकूल - यह एक विकास कार्य है, डेटाबेस प्रशासन नहीं। –

+0

इसका चयन करने के लिए सबसे अच्छा अभ्यास है - मुझे नहीं लगता कि यह dba.se * –

उत्तर

5

एक्सएमएल कुछ ... इस क्षेत्र में कमियों है देखते हैं। बड़ी एक्सएमएल फाइलें, जैसा कि आप नोट करते हैं, रैम और यूएनडीओ को हॉग कर सकते हैं जैसे कल नहीं है।

मुझे ईमानदारी से विश्वास नहीं है कि "सर्वोत्तम प्रथाओं" नामक कुछ मौजूद है, यह सब आपके डेटाबेस, सर्वर और प्रश्नों पर निर्भर करता है। हालांकि, यहां एक सहयोगी (मैं क्रेडिट का दावा नहीं कर सकता) जो कि बहुत जटिल (4.5-4) एक्सएमएल को बड़ी संख्या में (20?) बड़ी तालिका (10-400 मीटर पंक्तियों) से बहुत जटिल के साथ डिस्क पर लिखने के लिए किया गया है उप प्रश्नों।

  • असल में उन XMLElements

  • के सभी लिख अपने SELECT कथन बिल्कुल जटिल है, तो एक मेज पहले पैदा करते हैं।

  • तालिका से चुनें, एक उचित तत्व लेना, उम्मीद है कि आपकी आईडी पर आधारित है। उदाहरण के लिए यदि आप निम्न संरचना यह होगा है <record>

    <someXML> 
        <record ID="1"> 
         <blah> 
          <moreBlah/> 
         </blah> 
        </record> 
        <record ID="2"> 
         <blah> 
          <moreBlah/> 
         </blah> 
        </record> 
    </someXML> 
    
  • पर विभाजित करने के लिए समझ में डेटाबेस से एक CLOB के रूप में प्रत्येक रिकॉर्ड का चयन करें। फिर आप सीएलओबी की एक श्रृंखला के साथ समाप्त होते हैं जो आपके आउटपुट एक्सएमएल को बनाएगा।

  • खुलने वाला टैग लिखें पहले तो अलग-अलग या मात्रा में, डिस्क

  • करने के लिए प्रत्येक CLOB बारे में सुनिश्चित करें कि आप स्थानीय रूप से डिस्क के लिए लिखें। यदि यह नेटवर्क शेयर को टालने योग्य नहीं है, जहां एक बड़ी वसा केबल है जो उस पर इशारा करती है। आप हमेशा बाद में अपनी फ़ाइल को स्थानांतरित कर सकते हैं और यह नेटवर्क में (या एक शहर/देश) में लिखने से अधिक कुशल होगा।

  • समांतरता! यह हमेशा संभव नहीं है लेकिन यदि आप ऐसा कर सकते हैं तो ऐसा करें।

  • समांतरता से सावधान रहें। आप विकृत एक्सएमएल लिखना नहीं चाहते हैं।

मैं प्रभावी ढंग से टबोन के दृष्टिकोण की वकालत कर रहा हूं, इसके बजाय इसे घटकों में सहेज रहा हूं। आप जो कुछ भी करते हैं वह पूरी चीज को याद में रखने से बचें।

2

पहले डीबीएमएस_एक्सएमएलजीएन का उपयोग करने का प्रयास करें। वहाँ अन्य तरीकों के साथ-साथ हैं, इस Oracle XML DB डॉक

DECLARE 
    v_ctx DBMS_XMLGEN.ctxhandle; 
    v_file UTL_FILE.file_type; 
    v_xml CLOB; 
    v_more BOOLEAN := TRUE; 
BEGIN 
    -- Create XML context. 
    v_ctx := DBMS_XMLGEN.newcontext('SELECT table_name, tablespace_name FROM user_tables WHERE rownum < 6'); 

    -- Set parameters to alter default Rowset and Row tag names and default case. 
    DBMS_XMLGEN.setrowsettag(v_ctx, 'USER_TABLES'); 
    DBMS_XMLGEN.setrowtag(v_ctx, 'TABLE'); 
    --DBMS_XMLGEN.settagcase(v_ctx, DBMS_XMLGen.LOWER_CASE); 

    -- Add an IE specfic XSL stylesheet reference so browser can transform the file. 
    --DBMS_XMLGEN.setstylesheetheader(v_ctx, 'C:\Development\XML\IEStyle.xsl', 'text/xsl'); 

    -- Create the XML document. 
    v_xml := DBMS_XMLGEN.getxml(v_ctx); 
    DBMS_XMLGEN.closecontext(v_ctx); 

    -- Output XML document to file. 
    v_file := UTL_FILE.fopen('C:\Development\XML\', 'test1.xml', 'w'); 
    WHILE v_more LOOP 
    UTL_FILE.put(v_file, SUBSTR(v_xml, 1, 32767)); 
    IF LENGTH(v_xml) > 32767 THEN 
     v_xml := SUBSTR(v_xml, 32768); 
    ELSE 
     v_more := FALSE; 
    END IF; 
    END LOOP; 
    UTL_FILE.fclose(v_file); 

    -- test insert into table 
    /* 
    insert into t_clob (clob_col) values (v_xml); 
    commit; 
    */ 
EXCEPTION 
    WHEN OTHERS THEN 
    DBMS_OUTPUT.put_line(Substr(SQLERRM,1,255)); 
    UTL_FILE.fclose(v_file); 
END; 

ध्यान दें कि मैं उत्कृष्ट oracle-base साइट से इस का सबसे उधार

+0

हाय, क्या आप कृपया http://stackoverflow.com/questions/25279365/utl-file-write-error-when-calling-utl-file-put-in-a-loop के साथ मेरी सहायता करेंगे? – Jaskey

0

एक और चाल कई एक्सएमएल फाइलों में परिणाम लिख रही है, यानी तालिका -01_Rows_00001_99999.xml जैसे प्रति फ़ाइल 10.000 पंक्तियां कहें। फिर आवश्यक होने पर बाद में एक्सएमएल फाइलों को मर्ज करें।

संबंधित मुद्दे