समस्या यह है कि आप एक कमिट में लाने की कोशिश कर रहे हैं।
जब आप My_Data_Cur
खोलते हैं for update
. के साथ खंड में, Oracle को प्रत्येक पंक्ति को My_Data_1
. में लॉक करना होता है तालिका इससे पहले कि वह किसी भी पंक्ति को वापस कर सके। जब आप commit
, Oracle को उन सभी तालों को छोड़ना होगा (Oracle द्वारा बनाए गए ताले लेन-देन की अवधि नहीं रखते हैं)। चूंकि कर्सर में अब आपके द्वारा अनुरोधित ताले नहीं हैं, Oracle को कर्सर को बंद करना होगा क्योंकि यह अब for update
को संतुष्ट नहीं कर सकता है खंड। इसलिए, दूसरा फ़ेच 0 पंक्तियों को वापस करना चाहिए।
सबसे तार्किक तरीका लगभग हमेशा commit
. को हटाना होगा और एक ही लेन-देन में पूरी बात करें। यदि आपको वास्तव में, वास्तव में, वास्तव में अलग लेनदेन की आवश्यकता है, तो आपको लूप के प्रत्येक पुनरावृत्ति के लिए कर्सर को खोलना और बंद करना होगा। सबसे अधिक संभावना है, आप कर्सर को हर बार खोले जाने पर केवल 100 पंक्तियों को वापस करने के लिए प्रतिबंधित करने के लिए कुछ करना चाहेंगे (यानी एक rownum <= 100
क्लॉज) ताकि आपको लॉक लगाने के लिए हर पंक्ति पर जाने का खर्च न उठाना पड़े और फिर लूप के माध्यम से हर बार लॉक को रिलीज़ करने के लिए आपके द्वारा संसाधित और हटाए गए 100 के अलावा हर पंक्ति पर जाने का खर्च न उठाना पड़े।