जैसा कि @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
. पर स्विच करना होगा क्लाइंट को स्पूल करने के बजाय सर्वर पर लिखना।