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

एक sqlplus परिणाम को xml फ़ाइल में स्पूल करते समय अवांछित नई लाइनें

जैसा कि @kfinity ने सुझाव दिया है, यह CLOB हैंडलिंग से संबंधित है, लेकिन यह भी कि कैसे dbms_output काम करता है। आप CLOB को 32k के टुकड़ों में पढ़ रहे हैं, और उनमें से प्रत्येक भाग को put_line() के साथ लिख रहे हैं , जो प्रत्येक 32k खंड के बाद एक न्यूलाइन वर्ण जोड़ता है। वे आपके एक्सएमएल दस्तावेज़ में किसी भी मौजूदा लाइन ब्रेक के साथ संरेखित नहीं हैं, इसलिए आपको मूल ब्रेक मिलते हैं, फिर अतिरिक्त - जो कुछ हद तक यादृच्छिक और मध्य-पाठ दिखाई देते हैं, लेकिन वास्तव में अनुमानित स्थानों में होते हैं।

एक स्पष्ट समाधान put_line() . से स्विच करना है करने के लिए put() , लेकिन यह अधिकतम बफर आकार को तोड़ देगा और "ORU-10028:लाइन लंबाई ओवरफ्लो, प्रति पंक्ति 32767 बाइट्स की सीमा" जैसा कुछ फेंक देगा।

निश्चित 32k विखंडू में पढ़ने के बजाय, आप एक समय में एक पंक्ति पढ़ सकते हैं; CLOB वास्तव में इस तरह की लाइनों को नहीं समझता है, लेकिन आप लाइन ब्रेक की तलाश कर सकते हैं, कुछ इस तरह:

WHILE pos < v_clob_length LOOP
  -- read to next newline if there is one, rest of CLOB if not
  if dbms_lob.instr(v_clob, chr(10), pos) > 0 then
    amount := dbms_lob.instr(v_clob, chr(10), pos) - pos;
    dbms_lob.read(v_clob, amount, pos, buffer);
    pos := pos + amount + 1; -- skip newline character
  else
    amount := 32767;
    dbms_lob.read(v_clob, amount, pos, buffer);
    pos := pos + amount;
  end if;

  dbms_output.put_line(buffer);
END LOOP;

if वर्तमान स्थिति के बाद, एक न्यूलाइन वर्ण की तलाश करता है। यदि यह एक पाता है तो राशि की गणना वर्तमान स्थिति से उस नई पंक्ति में वर्णों की संख्या के रूप में की जाती है (या बल्कि, शून्य से एक - जैसा कि आप स्वयं नई रेखा नहीं चाहते हैं), यह कई वर्णों को पढ़ता है, और फिर स्थिति को समायोजित करता है पढ़ी गई राशि से प्लस वन (नई पंक्ति को छोड़ने के लिए - जिसे आप नहीं चाहते/चाहते हैं put_line() के रूप में अभी भी एक जोड़ता है)।

यदि यह एक नहीं मिलता है तो यह 32k तक पढ़ता है - उम्मीद है कि केवल एक बार; यदि इससे अधिक हैं तो कोई लाइन ब्रेक के साथ छोड़े गए वर्ण हो सकते हैं तो यह दूसरा पढ़ेगा लेकिन फिर भी उस दुष्ट अतिरिक्त नई लाइन को जोड़ देगा और उस लाइन को तोड़ देगा। dbms_output . का उपयोग करके आप इसके बारे में बहुत कुछ नहीं कर सकते हैं हालांकि, आपको utl_file . पर स्विच करना होगा क्लाइंट को स्पूल करने के बजाय सर्वर पर लिखना।




  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 11.2 Windows दो लाइनों के साथ स्टार्टअप नहीं कर सकता

  2. Oracle संग्रहीत कार्यविधि के लिए वैश्विक अस्थायी तालिकाओं के लिए वैकल्पिक विधि

  3. ओरेकल टेबल (डेटा) को INSERT स्टेटमेंट में डंप करें

  4. कैसे JasperReports के साथ Oracle में बूँद स्तंभ से एक छवि को देखने के लिए?

  5. एक्सेल VBA 64 बिट (DSN कम और tnsnames) का उपयोग करके ODBC (OLEDB नहीं) के लिए Oracle 11g ado कनेक्शन स्ट्रिंग्स