Oracle प्रलेखन से :
यदि आपकी क्वेरी किसी एकल तालिका का संदर्भ देती है तो FOR UPDATE
. के बीच कोई अंतर नहीं है और FOR UPDATE OF ...
, लेकिन बाद वाला अभी भी स्व-दस्तावेजीकरण के रूप में उपयोगी हो सकता है यह इंगित करने के लिए कि आप किन कॉलमों को अपडेट करना चाहते हैं। हालांकि यह प्रतिबंधित नहीं करता है कि आप क्या अपडेट कर सकते हैं। अगर आपके पास है:
CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;
तो आप अभी भी कर सकते हैं:
UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;
लेकिन अगर एक से अधिक टेबल हैं तो FOR UPDATE OF ...
केवल उन पंक्तियों को उन तालिकाओं में लॉक करेगा जिनमें आपके द्वारा निर्दिष्ट कॉलम शामिल हैं OF
खंड।
मुझे लगता है कि आप इस प्रश्न में जो कह रहे हैं उसके विपरीत। निर्दिष्ट करना FOR UPDATE OF sal
न केवल sal
को लॉक करता है कॉलम; आप कभी भी एक कॉलम को लॉक नहीं कर सकते हैं, न्यूनतम लॉक पंक्ति स्तर पर है। (ताले के बारे में और पढ़ें
) यह तालिका में सभी पंक्तियों को लॉक कर देता है जिसमें SAL
. होता है कॉलम, जो क्वेरी द्वारा चुने गए हैं।
आपके प्रश्न के अपडेट में, आपकी कर्सर क्वेरी emp
. में शामिल हो रही है और dept
, लेकिन OF
खंड में केवल sal
है , emp
. में एक कॉलम मेज़। emp
. में पंक्तियां जब कर्सर खोला जाएगा तो टेबल लॉक हो जाएगी, और जब तक आप commit
या rollback
वह सत्र। अपने कर्सर लूप में आप यह कर सकते हैं:
UPDATE emp SET ... WHERE CURRENT OF emp_cur;
... पंक्ति को emp
. में अपडेट करने के लिए तालिका जो लूप के इस पुनरावृत्ति से संबंधित है। आप नहीं करो:
UPDATE dept SET ... WHERE CURRENT OF emp_cur;
... क्योंकि dept
. में पंक्तियाँ टेबल लॉक नहीं हैं, क्योंकि OF
. में कोई कॉलम नहीं था . इसका मतलब यह भी है कि आपके दूसरे सत्र में dept
पंक्तियों को स्वतंत्र रूप से अपडेट किया जा सकता है, क्योंकि वे पहले सत्र तक लॉक नहीं हैं।