सबसे पहले, आप आमतौर पर DBMS_OUTPUT
. का उपयोग नहीं करेंगे लॉगिंग के लिए। यह आम तौर पर लॉग टेबल पर डेटा लिखने के लिए और अधिक समझ में आता है, खासकर यदि आपकी लॉगिंग प्रक्रिया को एक स्वायत्त लेनदेन के रूप में परिभाषित किया गया था ताकि आप प्रक्रिया के चलते लॉग डेटा की निगरानी कर सकें। DBMS_OUTPUT
पूरी प्रक्रिया समाप्त होने के बाद ही प्रदर्शित होने जा रहा है, जिस बिंदु पर यह आम तौर पर कुछ हद तक व्यर्थ है।
उस पहले बिंदु से संबंधित, DBMS_OUTPUT
. पर निर्भर कॉल करने वाले को यह इंगित करने के लिए कि किसी प्रकार का अपवाद हुआ है, एक बहुत ही खराब प्रथा है। कम से कम, आप फेंके गए अपवाद को फिर से उठाना चाहेंगे ताकि समस्या को डीबग करने के लिए आपको त्रुटि स्टैक मिल जाए।
दूसरा, जब आप आउटपुट को सक्षम करते हैं, तो आपको उस बफर का आकार निर्दिष्ट करना होगा जो DBMS_OUTPUT
है को लिख सकते हैं। ऐसा प्रतीत होता है कि आपने बफ़र को 20,000 बाइट्स घोषित कर दिया है जो कि डिफ़ॉल्ट है यदि आप बस
SQL> set serveroutput on;
आप इसे आकार निर्दिष्ट करके बदल सकते हैं लेकिन अधिकतम आकार 1,000,000 बाइट्स तक सीमित है
SQL> set serveroutput on size 1000000;
यदि आप 1000 पंक्तियों में 3 अरब पंक्तियों को अद्यतन करने की योजना बना रहे हैं, तो यह बहुत छोटा बफर होगा। आप अपने वर्तमान कोड के साथ उस मात्रा का 60 गुना से अधिक डेटा उत्पन्न करने जा रहे हैं। यदि आप क्लाइंट और सर्वर दोनों पर 10.2 का उपयोग कर रहे हैं, तो आपको असीमित बफर आवंटित करने में सक्षम होना चाहिए
SQL> set serveroutput on size unlimited;
लेकिन यह पहले के रिलीज में एक विकल्प नहीं है।
अंत में, क्या आप निश्चित हैं कि आपको सबसे पहले पीएल/एसक्यूएल का सहारा लेना होगा? ऐसा प्रतीत होता है कि आप केवल एक अद्यतन निष्पादित करके इसे और अधिक कुशलता से कर सकते हैं
UPDATE table_
SET id = floor( seq/ 10000000000000 )
WHERE id is null;
यह बहुत कम कोड है, पढ़ने में बहुत आसान है, और PL/SQL विकल्प की तुलना में अधिक कुशल होगा। केवल नकारात्मक पक्ष यह है कि इसके लिए आवश्यक है कि आपका यूएनडीओ टेबलस्पेस यूएनडीओ को समायोजित करने के लिए पर्याप्त बड़ा हो, लेकिन एनयूएलएल से एक गैर-न्यूल संख्यात्मक मान में एक कॉलम को अपडेट करने से इतना अधिक यूएनडीओ उत्पन्न नहीं होना चाहिए।