2010-06-18 8 views
8

अद्यतन के लिए मैं खाद्य और बार तालिका से चयन कर रहा हूं। मैं फूड्स के रिकॉर्ड लॉक करना चाहता हूं जो लौटाए जा रहे हैं, लेकिन मैं नहीं चाहता कि बीएआर के रिकॉर्ड लॉक हो जाएं।चयन के साथ ओरेकल लॉकिंग ...

cursor c_foobar is 
select foo.*, bar.* from 
foo, bar 
where foo.id = bar.foo_id 
for update of <what should I put here?> 

ऐसा लगता है कि मुझे अलग-अलग कॉलम निर्दिष्ट करने की आवश्यकता है, लेकिन मैं चाहता हूं कि foo का पूरा रिकॉर्ड लॉक हो। जैसे मुझे लगता है मैं कुछ ऐसा कर सकता है इच्छा:

cursor c_foobar is 
select foo.*, bar.* from 
foo, bar 
where foo.id = bar.foo_id 
for update of foo 

मैं आदेश उन सब को लॉक करने के लिए for update of खंड में foo के हर स्तंभ की गणना करने में है? या क्या मैं मनमाने ढंग से foo में किसी भी कॉलम का चयन कर सकता हूं, यहां तक ​​कि जो लोग इसकी प्राथमिक कुंजी नहीं हैं, और यह पूरे रिकॉर्ड को लॉक कर देगा?

उत्तर

12
the 10G PL/SQL documentation से

:

जब एक से अधिक तालिकाओं से क्वेरी, आप के लिए अपडेट खंड पंक्ति विशेष तालिकाओं के लिए ताला लगा सीमित करने के लिए उपयोग कर सकते हैं। तालिका में पंक्तियों को केवल तभी बंद कर दिया जाता है जब फॉर क्लॉज का अद्यतन उस तालिका में पर कॉलम को संदर्भित करता है। उदाहरण के लिए, निम्न क्वेरी कर्मचारियों तालिका में लेकिन विभागों तालिका में नहीं पंक्तियों ताले:

DECLARE 
    CURSOR c1 IS SELECT last_name, department_name FROM employees, departments 
    WHERE employees.department_id = departments.department_id 
      AND job_id = 'SA_MAN' 
     FOR UPDATE OF salary; 
+0

बहुत अच्छा, यकीन नहीं है कि मैं इसे कैसे चूक गया। तो मुझे लगता है कि इसे पंक्ति से किसी भी मनमाने ढंग से कॉलम नाम की आवश्यकता है ... आसान लेकिन मेरे लिए बहुत सहज नहीं लगता है। –

+0

मैं सहमत हूं, ऐसा नहीं है। मुझे लगता है कि कहीं भी पढ़ना याद है कि कॉलम निर्दिष्ट करने की आवश्यकता है ताकि भविष्य के संस्करण में शायद ओरेकल केवल पंक्ति में विशेष कॉलम लॉक कर सके। लेकिन मेरी याददाश्त उस पर आलसी है। –

+2

यह स्वयं-दस्तावेज़ कोड का एक रूप है, मुझे लगता है: "मैं केवल कॉलम 'वेतन' को अपडेट करना चाहता हूं" –

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