PL/SQL वैरिएबल स्कोप और इनर आउटर ब्लॉक: नेस्टेड संरचना

⚡ स्मार्ट सारांश

PL/SQL में नेस्टेड ब्लॉक एक ब्लॉक को दूसरे के अंदर रखते हैं, जिससे आप जटिल लॉजिक को अलग कर सकते हैं और एक्सेप्शन हैंडलिंग को आइसोलेट कर सकते हैं। बाहरी और भीतरी ब्लॉकों के बीच वेरिएबल स्कोप को समझना और ब्लॉक लेबल का उपयोग करना, समान नाम वाले वेरिएबल्स को स्पष्ट रखता है।

  • 🧱 नेस्टेड ब्लॉक: नेस्टेड ब्लॉक एक PL/SQL ब्लॉक होता है जिसे किसी अन्य ब्लॉक के निष्पादन या अपवाद अनुभाग के अंदर रखा जाता है।
  • 🌳 बाहरी और आंतरिक: एक बाहरी, या पैरेंट ब्लॉक, में कई आंतरिक, या चाइल्ड ब्लॉक हो सकते हैं, जिनमें से प्रत्येक एक पूर्ण PL/SQL ब्लॉक होता है।
  • चर का दायरा: किसी आंतरिक ब्लॉक से पहले घोषित किए गए बाहरी ब्लॉक के चर उस ब्लॉक के अंदर दिखाई देते हैं, लेकिन आंतरिक ब्लॉक के चर बाहर दिखाई नहीं देते हैं।
  • ब्लॉक लेबल: बाहरी ब्लॉक को लेबल करने से आंतरिक ब्लॉक लेबल.वेरिएबल_नाम के रूप में समान नाम वाले बाहरी वेरिएबल को संदर्भित कर सकता है।
  • अपवाद पृथक्करण: नेस्टिंग प्रत्येक ब्लॉक को अपने स्वयं के अपवादों को संभालने की अनुमति देती है,ping त्रुटि उत्पन्न करने वाले कोड के निकट ही त्रुटि प्रबंधन की व्यवस्था करें।
  • 🤖 एआई सहायता: GitHub Copilot जैसे AI सहायक लेबल वाले नेस्टेड ब्लॉक का मसौदा तैयार करते हैं और वेरिएबल-स्कोप टकराव को चिह्नित करते हैं।

नेस्टेड आंतरिक और बाहरी ब्लॉकों में PL/SQL वेरिएबल स्कोप

नेस्टेड ब्लॉक क्या है? Oracle?

In PL / SQLप्रत्येक ब्लॉक को दूसरे ब्लॉक के अंदर समाहित किया जा सकता है। ऐसे ब्लॉक को नेस्टेड ब्लॉक कहा जाता है। नेस्टेड ब्लॉक तब बहुत आम होते हैं जब आप किसी प्रक्रिया को निष्पादित करना चाहते हैं जबकि एक ब्लॉक को दूसरे ब्लॉक के अंदर रखा जाता है।ping उस प्रक्रिया का कोड एक अलग कंटेनर (ब्लॉक) में रखें।

नेस्टेड ब्लॉक की अवधारणा जटिल लॉजिक को अलग-अलग ब्लॉकों में विभाजित करके प्रोग्रामर को पठनीयता में सुधार करने में मदद करती है, और यह अनुमति देती है कि अपवाद मुख्य बाहरी ब्लॉक के भीतर संभाले जाने वाले प्रत्येक ब्लॉक के लिए।

नेस्टेड ब्लॉक संरचना

एक ब्लॉक दूसरे ब्लॉक के भीतर नेस्टेड हो सकता है। यह निष्पादन भाग या अपवाद प्रबंधन भाग में नेस्टेड हो सकता है, और इन ब्लॉकों को लेबल भी किया जा सकता है। एक बाहरी ब्लॉक में कई आंतरिक ब्लॉक हो सकते हैं। प्रत्येक आंतरिक ब्लॉक स्वयं एक ब्लॉक होता है। PL/SQL ब्लॉकइसलिए, आंतरिक ब्लॉक के सभी गुण और विशेषताएँ बाहरी ब्लॉक के समान ही होती हैं। जनक ब्लॉक मुख्य ब्लॉक होता है, और उपबंधित ब्लॉक आंतरिक ब्लॉक होता है।

नीचे दी गई छवि नेस्टेड ब्लॉक संरचना का एक चित्रात्मक प्रतिनिधित्व देती है, जिसमें पैरेंट ब्लॉक मुख्य ब्लॉक है और चाइल्ड ब्लॉक नेस्टेड ब्लॉक है।

पैरेंट आउटर ब्लॉक और चाइल्ड इनर ब्लॉक वाले PL/SQL नेस्टेड ब्लॉक का चित्रात्मक निरूपण

नीचे नेस्टेड ब्लॉक का सिंटैक्स दिया गया है। नीचे दिए गए स्क्रीनशॉट में नेस्टेड ब्लॉक का सिंटैक्स और उसके लेबल किए गए बाहरी और आंतरिक ब्लॉक दिखाए गए हैं।

लेबल किए गए बाहरी और आंतरिक ब्लॉकों को दर्शाने वाला नेस्टेड ब्लॉक सिंटैक्स, जिनमें से प्रत्येक में DECLARE, BEGIN और EXCEPTION अनुभाग शामिल हैं।

नेस्टेड ब्लॉक सिंटैक्स

<<outer_block>>
DECLARE
 <Declarative section> 
BEGIN
 <Execution part for outer block begins>

 <<inner block>>
 DECLARE
  <Declarative section>
 BEGIN
  <Execution part for inner block>.
 EXCEPTION 
  <Exception handling part>
 END;

 <Execution part for outer block begins> 
EXCEPTION 
<Exception handling part>
END;
  • ऊपर दिया गया सिंटैक्स नेस्टेड ब्लॉक को दर्शाता है जिसमें कुल दो ब्लॉक शामिल हैं।
  • इन ब्लॉकों को 'आउटर_ब्लॉक' और 'इनर_ब्लॉक' के रूप में लेबल किया गया है।

नेस्टेड ब्लॉक में स्कोप: वेरिएबल स्कोप

नेस्टेड ब्लॉक में, प्रत्येक ब्लॉक का उपयोग करने से पहले आपको उसके स्कोप और विजिबिलिटी को स्पष्ट रूप से समझना आवश्यक है। विशेष रूप से भीतरी ब्लॉक में, भीतरी और बाहरी दोनों ब्लॉकों के तत्व दिखाई देते हैं, इसलिए इसकी सही समझ होना अनिवार्य है।

नीचे दिए गए बिंदु नेस्टेड ब्लॉकों में स्कोप का सारांश प्रस्तुत करते हैं।

  • बाहरी ब्लॉक में घोषित तत्व और आंतरिक ब्लॉक की परिभाषा से पहले परिभाषित मान, आंतरिक ब्लॉक के अंदर दिखाई देते हैं।
  • आंतरिक ब्लॉक में घोषित तत्व बाहरी ब्लॉक में दिखाई नहीं देते हैं। वे केवल आंतरिक ब्लॉक के भीतर ही दिखाई देते हैं।
  • बाहरी ब्लॉक और आंतरिक ब्लॉक में एक हो सकता है परिवर्तनशील इसी नाम से।
  • समान नाम वाले वेरिएबल्स के मामले में, आंतरिक ब्लॉक डिफ़ॉल्ट रूप से केवल आंतरिक ब्लॉक में घोषित वेरिएबल को ही संदर्भित करता है।
  • यदि आंतरिक ब्लॉक बाहरी ब्लॉक के उस चर को संदर्भित करना चाहता है जिसका नाम आंतरिक ब्लॉक के चर के समान है, तो बाहरी ब्लॉक को LABELLED किया जाना चाहिए, और बाहरी ब्लॉक के चर को ' के रूप में संदर्भित किया जा सकता है। . '.

नीचे दिया गया उदाहरण आपको इन स्कोपों ​​के बारे में और अधिक समझने में मदद करेगा।

उदाहरण 1: इस उदाहरण में, हम आंतरिक और बाहरी ब्लॉक में चरों का दायरा देखते हैं। हम यह भी देखते हैं कि ब्लॉक लेबल का उपयोग करके चरों को कैसे संदर्भित किया जाता है।

नीचे दिया गया स्क्रीनशॉट उदाहरण 1 दिखाता है, जहां आंतरिक ब्लॉक ब्लॉक लेबल का उपयोग करके बाहरी ब्लॉक चर को संदर्भित करता है।

नेस्टेड ब्लॉक में वेरिएबल स्कोप का उदाहरण, बाहरी ब्लॉक वेरिएबल को उसके ब्लॉक लेबल द्वारा संदर्भित करना।

<<OUTER_BLOCK>>
DECLARE
var1 VARCHAR2(30):='outer_block';
var2 VARCHAR2(30):='value before inner block';
BEGIN
<<INNER_BLOCK>>
DECLARE
var1 VARCHAR2(30):='inner_block';
BEGIN
dbms_output.put_line(var1);
dbms_output.put_line(OUTER_BLOCK.var1); 
dbms_output.put_line(var2);
END;
var2:='value after inner block';
END;
/

Code स्पष्टीकरण:

  • Code पंक्ति 1: बाहरी ब्लॉक को “OUTER_BLOCK” के रूप में लेबल करना।
  • Code पंक्ति 3: 'var1' नामक चर को VARCHAR2 (30) के रूप में घोषित करना, जिसका प्रारंभिक मान “outer_block” है।
  • Code पंक्ति 4: 'var2' नामक चर को VARCHAR2 (30) के रूप में घोषित करना, जिसका प्रारंभिक मान "आंतरिक ब्लॉक से पहले का मान" है।
  • Code पंक्ति 6: आंतरिक ब्लॉक को “INNER_BLOCK” के रूप में लेबल करना।
  • Code पंक्ति 8: आंतरिक ब्लॉक में 'var1' नामक चर को VARCHAR2 (30) के रूप में घोषित करना, जिसका प्रारंभिक मान “inner_block” है।
  • Code पंक्ति 10: 'var1' का मान प्रिंट किया जा रहा है। चूंकि कोई लेबल नहीं दिया गया है, इसलिए डिफ़ॉल्ट रूप से यह आंतरिक ब्लॉक से मान लेता है, जिसके परिणामस्वरूप 'inner_block' संदेश प्रिंट होता है।
  • Code पंक्ति 11: बाहरी ब्लॉक के वेरिएबल 'var1' का मान प्रिंट किया जा रहा है। चूंकि आंतरिक ब्लॉक में इसी नाम का एक वेरिएबल है, इसलिए हम बाहरी ब्लॉक के लेबल का संदर्भ लेते हैं। इस प्रकार यह 'outer_block' संदेश प्रिंट करता है।
  • Code पंक्ति 12: बाहरी ब्लॉक के वेरिएबल 'var2' का मान प्रिंट किया जा रहा है। चूंकि भीतरी ब्लॉक में इस नाम का कोई वेरिएबल नहीं है, इसलिए डिफ़ॉल्ट रूप से यह बाहरी ब्लॉक से मान लेता है, जिसके परिणामस्वरूप 'भीतरी ब्लॉक से पहले का मान' संदेश प्रिंट होता है।
  • बाहरी ब्लॉक में स्थित 'var2' नामक वेरिएबल को 'भीतरी ब्लॉक के बाद का मान' असाइन किया गया है। लेकिन यह असाइनमेंट भीतरी ब्लॉक की परिभाषा के बाद होता है, इसलिए यह मान भीतरी ब्लॉक के अंदर मौजूद नहीं है।

उदाहरण 2: इस उदाहरण में, हम दो संख्याओं के बीच का अंतर ज्ञात करते हैं, जिनमें से एक बाहरी ब्लॉक में और दूसरी आंतरिक ब्लॉक में घोषित की गई है। दोनों का नाम समान है। आइए देखें कि इन चरों को संदर्भित करने में ब्लॉक लेबल कैसे उपयोगी है।

नीचे दिया गया स्क्रीनशॉट उदाहरण 2 को दर्शाता है, जो समान नाम वाले बाहरी और आंतरिक ब्लॉक चरों के बीच अंतर की गणना करता है।

ब्लॉक लेबल का उपयोग करके समान नाम वाले बाहरी और आंतरिक ब्लॉक चरों के बीच अंतर की गणना करने का उदाहरण

<<OUTER_BLOCK>>
DECLARE 
ln_val NUMBER :=5;
BEGIN
<<INNER_BLOCK>>
DECLARE 
ln_val NUMBER :=3;
BEGIN
dbms_output.put_line('The difference between outer block and inner block variable is:'||outer_block.ln_val-inner_block.ln_val);
END;
END;
/

Code स्पष्टीकरण:

  • Code पंक्ति 1: बाहरी ब्लॉक को “OUTER_BLOCK” के रूप में लेबल करना।
  • Code पंक्ति 3: 'ln_val' नामक एक चर को NUMBER के रूप में घोषित किया जा रहा है, जिसका प्रारंभिक मान "5" है।
  • Code पंक्ति 5: आंतरिक ब्लॉक को “INNER_BLOCK” के रूप में लेबल करना।
  • Code पंक्ति 7: आंतरिक ब्लॉक में 'ln_val' नामक एक चर को NUMBER के रूप में घोषित करना, जिसका प्रारंभिक मान "3" है।
  • Code पंक्ति 9: बाहरी और आंतरिक ब्लॉक से 'ln_val' के मान में अंतर प्रिंट करना। . एक ही वेरिएबल नाम के कारण होने वाले टकराव से बचने के लिए इन वेरिएबल्स को संदर्भित करने के लिए "" प्रारूप का उपयोग किया जाता है।

अक्सर पूछे जाने वाले प्रश्न

नेस्टेड ब्लॉक एक अनाम ब्लॉक होता है जिसे किसी अन्य ब्लॉक के अंदर रखा जाता है और यह जहां दिखाई देता है वहीं इनलाइन चलता है। Subprogram (प्रक्रिया या फ़ंक्शन) एक नामित, पुन: प्रयोज्य इकाई है जिसे अलग से संग्रहीत किया जाता है और नाम से, वैकल्पिक रूप से मापदंडों के साथ, कॉल किया जाता है।

प्रत्येक ब्लॉक का अपना एक EXCEPTION सेक्शन हो सकता है। भीतरी ब्लॉक में उत्पन्न होने वाली किसी भी त्रुटि को सबसे पहले उसी ब्लॉक द्वारा हल किया जाता है; यदि उसे हल नहीं किया जाता है, तो वह बाहरी ब्लॉक के हैंडलर तक पहुँच जाती है। इससे आप प्रत्येक ब्लॉक के लिए त्रुटि प्रबंधन को अलग-अलग कर सकते हैं।

PL/SQL में कोई निश्चित सीमा नहीं होती, इसलिए ब्लॉक कई स्तरों तक नेस्टेड हो सकते हैं। व्यवहार में, अधिक नेस्टिंग से पठनीयता प्रभावित होती है, इसलिए अधिकांश कोड दो या तीन स्तरों तक ही नेस्टिंग करते हैं और पुन: प्रयोज्य लॉजिक को सबप्रोग्राम में स्थानांतरित कर देते हैं।

ब्लॉक लेबल, जिसे DECLARE से पहले डबल एंगल ब्रैकेट में नाम के रूप में लिखा जाता है, ब्लॉक का नामकरण करता है। लेबल आंतरिक कोड को बाहरी वेरिएबल को label.variable_name के रूप में परिभाषित करने की अनुमति देते हैं और GOTO लक्ष्य के रूप में भी कार्य कर सकते हैं, जिससे नेस्टेड कोड को पढ़ना और दस्तावेज़ित करना आसान हो जाता है।

जी हां। नेस्टेड ब्लॉक कहीं भी इस्तेमाल किया जा सकता है जहां निष्पादन योग्य स्टेटमेंट की अनुमति हो, जैसे कि लूप, IF ब्रांच या प्रोसीजर बॉडी। इससे आप डिक्लेरेशन और एक्सेप्शन हैंडलिंग को कोड के केवल उसी हिस्से तक सीमित कर सकते हैं जहां उनकी आवश्यकता है।

नेस्टिंग मुख्य रूप से एक कंपाइल-टाइम स्ट्रक्चरिंग टूल है और इससे रनटाइम पर कोई खास भार नहीं पड़ता। यह पठनीयता और त्रुटि पृथक्करण को बेहतर बनाता है। अत्यधिक गहरी नेस्टिंग से आमतौर पर रखरखाव में कठिनाई होती है, न कि गति में।

हां. गिटहब कोपिलॉट एक टिप्पणी से प्राप्त ड्राफ्ट में बाहरी और आंतरिक ब्लॉक, जिनमें DECLARE, BEGIN और EXCEPTION अनुभाग शामिल हैं, को लेबल किया गया है। Revब्लॉक लेबल और वेरिएबल स्कोप को ध्यान से देखें ताकि समान नाम वाले आंतरिक और बाहरी वेरिएबल इच्छानुसार हल हो सकें।

कृत्रिम बुद्धिमत्ता सहायक नेस्टेड ब्लॉकों का विश्लेषण करते हैं और छिपे हुए चर, अयोग्य संदर्भों और दायरे से बाहर की पहुँच को चिह्नित करते हैं। यह मशीन लर्निंग समीक्षा उन स्थानों को उजागर करती है जहाँ कोड चलने से पहले एक आंतरिक ब्लॉक चुपचाप गलत समान नाम वाले चर का उपयोग करता है।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: