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

एक्सएमएल पीएलएसक्यूएल पुनरावृत्त उत्पन्न करना

पीएल/एसक्यूएल में बहुत बड़ा एक्सएमएल उत्पन्न करने का प्रयास करने का कोई मतलब नहीं है। समस्या पीएल/एसक्यूएल नहीं है, लेकिन पीएल/एसक्यूएल केवल एक्सएमएल डोम का समर्थन करता है, और डोम बड़े एक्सएमएल को बिल्कुल भी संभाल नहीं पाता है। आप यह नहीं कहते कि आपके पास किस आकार का XML दस्तावेज़ है, लेकिन मुझे यह जानकर आश्चर्य नहीं होगा कि आपके दस्तावेज़ को बनाने के लिए PL/SQL द्वारा उपयोग की जा रही मेमोरी परिणामी दस्तावेज़ के आकार से लगभग 10 से 30 गुना अधिक है।

क्या पीएल/एसक्यूएल के अलावा किसी अन्य चीज का उपयोग करके एक्सएमएल उत्पन्न करने का कोई विकल्प है? यदि नहीं, और मुझे वास्तव में ओरेकल डेटाबेस में बड़ी एक्सएमएल फाइलें उत्पन्न करनी थीं, तो मैं जावा संग्रहीत प्रक्रियाओं का उपयोग करने पर विचार करूंगा। यह सवाल जावा में इस तरह के काम को करने के तरीके के बारे में कुछ जवाब हैं।

संपादित करें आपकी टिप्पणी के जवाब में:आपका कोड निश्चित रूप से एक समय में एक पंक्ति नहीं लिख रहा है। यह एक साथ बहुत कुछ लिख रहा है, एक तथ्य जिसे मैंने क्वेरी SELECT * FROM all_objects का उपयोग करके सत्यापित किया है। मेरे Oracle 11g XE डेटाबेस पर। लूप एक बार चला और 7341 ऑब्जेक्ट लिखे, जिससे केवल 3MB से अधिक आकार की XML फ़ाइल बन गई।

फिर मैंने आपके द्वारा वर्णित 'वृद्धिशील' दृष्टिकोण का बेहतर समर्थन करने के लिए आपके कोड को संशोधित करने का प्रयास किया। इसमें शामिल है:

  • एक पंक्ति जोड़ना dbms_xmlgen.setmaxrows(ctx, max_rows); DBMS_XMLGEN को एक बार में केवल 5 पंक्तियाँ उत्पन्न करने के लिए कहना। अन्यथा यह एक ही बार में बहुत कुछ उत्पन्न करने का प्रयास करता है।

  • WHILE . के शीर्ष पर कोड को संशोधित करना लूप टू

    xml_result := dbms_xmlgen.getXML(ctx);
    num_rows_processed := DBMS_XMLGEN.GETNUMROWSPROCESSED(ctx);
    dbms_output.put_line('Got ' || num_rows_processed || ' rows processed');
    
    while num_rows_processed > 0
      -- rest of loop omitted
    
  • WHILE . के ठीक नीचे इन तीन पंक्तियों में से पहली को जोड़ना लूप।

फिर मैंने आपका कोड फिर से चलाया, और मैं इसे हर बार फ़ाइल में पाँच पंक्तियों के प्रत्येक बैच को लिखते हुए देख सकता था। हालाँकि, इस दृष्टिकोण के साथ एक छोटी सी समस्या है, जिसमें फ़ाइल को हर बार अधिलेखित कर दिया गया था। अंत में मेरे पास आउटपुट एक्सएमएल फ़ाइल में केवल एक ही रिकॉर्ड था। मैं सोच भी नहीं सकता कि यह वही होगा जो आप चाहते हैं।

WRITETOCLOB , WRITETOBUFFER और WRITETOFILE DBMS_XMLDOM में विधियां मौजूदा फ़ाइल में शामिल होने की क्षमता पर संकेत न दें, और ईमानदार होने के लिए मुझे आश्चर्य नहीं है कि वे नहीं करते हैं। यदि आप कर सकते हैं, तो आप अमान्य XML के साथ समाप्त हो जाएंगे, क्योंकि एक से अधिक <?xml ... ?> होंगे। फ़ाइल में घोषणा।

मैं अपनी पिछली सलाह पर कायम हूं। जब भी आपको बड़े XML से निपटने की आवश्यकता हो, Oracle डेटाबेस या अन्य जगहों पर, SAX या StAX का उपयोग करें। पीएल/एसक्यूएल या तो समर्थन नहीं करता है, इसलिए जावा संग्रहीत प्रक्रियाओं में आपको जो कुछ भी करने की ज़रूरत है वह करें या इसे डेटाबेस से बाहर करें।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle डेटाबेस के साथ .net 4.0 में Entity Framework का उपयोग करें - संभव है?

  2. सी #/ओरेकल:क्वेरी का एन्कोडिंग/कैरेक्टर सेट निर्दिष्ट करें?

  3. seq और ट्रिगर के साथ oracle में Autoincrement - अमान्य sql कथन

  4. त्रुटि- ORA-22835:CLOB से CHAR या BLOB से RAW रूपांतरण के लिए बफ़र बहुत छोटा है

  5. एक pl/sql फ़ंक्शन बनाएं और लीप वर्ष खोजें