2011-08-26 21 views
5

मैं ओरेकल संग्रहीत प्रक्रिया से एक बड़ी फ़ाइल> 7 एमबी लिख रहा हूं और प्रत्येक रिकॉर्ड के अंत में आवश्यकताओं को कोई लाइन समाप्ति वर्ण (कोई कैरिज रिटर्न/लाइन फीड) नहीं है।ओरेकल पीएल/एसक्यूएल UTL_FILE.PUT बफरिंग

मैंने UTL_FILE.PUT का उपयोग करके संग्रहीत प्रक्रिया लिखी है और मैं UTL_FILE.PUTLUS के साथ UTL_FILE.PUT पर प्रत्येक कॉल का पालन कर रहा हूं। एक बार जब मैं उस बिंदु पर पहुंच जाता हूं जहां मैंने बफर आकार (अधिकतम 32767 पर सेट किया है) से अधिक लिखने के बाद एक त्रुटि त्रुटि के साथ यह प्रक्रिया त्रुटियां हैं, हालांकि मैं FFLUSH कॉल कर रहा हूं। यदि मैं PUT_LINE कॉल के साथ PUT कॉल को प्रतिस्थापित करता हूं तो प्रक्रिया ठीक काम करती है।

क्या न्यूलाइन चरित्र के बिना बफर आकार से अधिक लिखना संभव नहीं है? यदि हां, तो क्या कोई काम है?

उत्तर

3

डस्टिन,

यहाँ ओरेकल प्रलेखन: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_file.htm#i1003404

स्टेट्स कि: FFLUSH शारीरिक रूप से फ़ाइल हैंडल से पहचान फाइल करने के लिए लंबित डेटा लिखता है। आम तौर पर, फ़ाइल में लिखा जा रहा डेटा buffered है। FFLUSH प्रक्रिया बफर किए गए डेटा को फ़ाइल में लिखने के लिए मजबूर करती है। डेटा को एक न्यूलाइन चरित्र के साथ समाप्त किया जाना चाहिए।

अंतिम वाक्य सबसे प्रासंगिक है।

क्या आप लाइन टर्मिनेटर के लिए परिणामस्वरूप फ़ाइल खोजने और उन्हें हटाने से पहले UTL_FILE.PUT_LINE का उपयोग कर डेटा नहीं लिख सकते?

बस एक सोचा ....

+0

FFLUSH कैसे काम करता है यह स्पष्ट करने के लिए धन्यवाद, मैंने अपनी खोजों में अंतिम वाक्य नहीं देखा था। – Dustin

+0

हाय @ ओली, मैं अभी भी उलझन में हूं कि कैसे FFLUSH काम करता है, (1 -> 32767 + एन), हर बार जब मैं डालता हूं, और मैं fflush। एक नई लाइन को अभी भी क्यों चाहिए? क्या आप समझाने में मदद करेंगे? – Jaskey

4

डॉक्स से नष्ट कर दिया बोली, ओली के जवाब

एक अन्य संभावित यह करने के लिए जिस तरह से देखते हैं एक जावा संग्रहीत प्रक्रिया है, जहां आप उपयोग कर सकते हैं और अधिक पूर्ण विशेषताओं फ़ाइलों को बनाने और लिखने के लिए जावा एपीआई।

+0

जावा संग्रहीत प्रक्रिया +1 – Ollie

+0

के साथ अच्छा विचार जावा संग्रहीत प्रक्रिया से मुझे चिंतित है।हालांकि मेरा मानना ​​है कि जावा कोड स्वयं सीधा होगा, हम अपनी दुकान में कोई जावा कोडिंग नहीं करते हैं, इसलिए किसी को लेने के लिए यह एक रखरखाव मुद्दा होगा। – Dustin

+0

क्या आप कृपया यह बताने में मदद करेंगे कि हम इस समस्या को BFILE ऑब्जेक्ट के साथ कैसे हल कर सकते हैं? – Jaskey

0

हालांकि यह वांछनीय से कम है, लेकिन आप हमेशा PUT कर सकते हैं जब तक कि आपको पता नहीं चला कि आप बफर आकार के करीब हैं। जब ऐसा होता है, तो आप FCLOSE फ़ाइल हैंडल (बफर को फ्लश कर सकते हैं) और (संलग्न) मोड का उपयोग कर FOPEN के साथ उसी फ़ाइल को फिर से खोल सकते हैं। दोबारा, इस तकनीक को आम तौर पर टालना चाहिए, विशेष रूप से यदि अन्य प्रक्रियाएं फ़ाइल तक पहुंचने का भी प्रयास कर रही हैं (उदाहरण के लिए: फ़ाइल बंद करना आमतौर पर उस प्रक्रिया को किसी भी ताले को रद्द करता है, जो लॉक प्राप्त करने की कोशिश कर रहे किसी अन्य प्रक्रिया को मुक्त करता है)।

0

सभी महान प्रतिक्रियाओं के लिए धन्यवाद, वे बहुत उपयोगी रहे हैं। जावा संग्रहीत प्रक्रिया जाने के तरीके की तरह लगती थी, लेकिन चूंकि हमारे पास घर में बहुत सारी जावा विशेषज्ञता नहीं है, इसलिए यह प्रबंधन द्वारा फेंक दिया जाएगा। लेकिन, मैं संग्रहीत प्रक्रिया से ऐसा करने का एक तरीका ढूंढ पाया। मुझे फ़ाइल बाइट मोड 'डब्लूबी' लिखने के लिए खोलना पड़ा। फिर, प्रत्येक रिकॉर्ड के लिए मैं फ़ाइल में लिख रहा हूं, मैं इसे UTL_RAW.CAST_TO_RAW के साथ रॉ डेटाटाइप में परिवर्तित करता हूं। फिर बफर को फ्लश करने के लिए किसी भी आवश्यक FFLUSH कॉल के बाद फ़ाइल को लिखने के लिए UTL_FILE.PUT_RAW का उपयोग करें। प्राप्त करने वाली प्रणाली फाइलें पढ़ने में सक्षम है; अब तक तो सब ठीक है।

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