نطاق PL/SQL المتغير والكتلة الخارجية الداخلية: البنية المتداخلة

⚡ ملخص ذكي

تتيح لك الكتل المتداخلة في لغة PL/SQL وضع كتلة داخل أخرى، مما يسمح لك بفصل المنطق المعقد وعزل معالجة الاستثناءات. كما أن فهم نطاق المتغيرات بين الكتل الخارجية والداخلية، واستخدام تسميات الكتل، يحافظ على وضوح المتغيرات التي تحمل نفس الاسم.

  • 🧱 كتلة متداخلة: الكتلة المتداخلة هي كتلة PL/SQL موضوعة داخل قسم التنفيذ أو الاستثناء لكتلة أخرى.
  • 🌳 خارجي وداخلي: يمكن أن تحتوي كتلة خارجية واحدة، أو كتلة أصلية، على العديد من الكتل الداخلية، أو الكتل الفرعية، كل منها عبارة عن كتلة PL/SQL كاملة.
  • 👁️ نطاق المتغيرات: تكون متغيرات الكتلة الخارجية المعلنة قبل الكتلة الداخلية مرئية داخلها، لكن متغيرات الكتلة الداخلية غير مرئية في الخارج.
  • 🏷️ تسميات الكتل: يسمح وضع علامة على الكتلة الخارجية للكتلة الداخلية بالإشارة إلى متغير خارجي يحمل نفس الاسم مثل label.variable_name.
  • 🛡️ عزل الاستثناءات: يُمكّن التداخل كل كتلة من معالجة استثناءاتها الخاصة، ويحافظ علىping معالجة الأخطاء بالقرب من الكود الذي تسبب في حدوثها.
  • 🤖 مساعدة الذكاء الاصطناعي: تقوم المساعدات المدعومة بالذكاء الاصطناعي مثل GitHub Copilot بصياغة الكتل المتداخلة المصنفة وتحديد تعارضات نطاق المتغيرات.

نطاق متغيرات PL/SQL عبر الكتل الداخلية والخارجية المتداخلة

ما هي الكتل المتداخلة Oracle?

In PL / SQLيمكن تضمين كل كتلة داخل كتلة أخرى. تُسمى هذه الكتلة بالكتلة المتداخلة. تُعد الكتل المتداخلة شائعة جدًا عند الرغبة في تنفيذ عملية معينة مع الحفاظ علىping الكود الخاص بتلك العملية في حاوية (كتلة) منفصلة.

يساعد مفهوم الكتل المتداخلة المبرمج على تحسين قابلية القراءة من خلال فصل المنطق المعقد إلى كتل فردية، ويسمح بـ استثناء لكل كتلة يتم التعامل معها داخل الكتلة الخارجية الرئيسية.

هيكل الكتلة المتداخلة

يمكن تضمين كتلة داخل كتلة أخرى. يمكن تضمينها إما في جزء التنفيذ أو في جزء معالجة الاستثناءات، ويمكن تسمية هذه الكتل أيضًا. يمكن أن تحتوي كتلة خارجية واحدة على العديد من الكتل الداخلية. كل كتلة داخلية هي في حد ذاتها كتلة بل/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;
  • يوضح التركيب أعلاه الكتلة المتداخلة التي تحتوي على ما مجموعه كتلتين.
  • تم تصنيف هذه الكتل على أنها "الكتلة الخارجية" و "الكتلة الداخلية".

النطاقات في الكتلة المتداخلة: النطاق المتغير

في الكتل المتداخلة، يجب فهم نطاق كل كتلة ومدى رؤيتها بوضوح قبل استخدامها. خاصةً في الكتلة الداخلية، حيث تكون عناصر من كلٍّ من الكتلة الخارجية والداخلية مرئية، لذا فإن فهم هذا الأمر ضروري.

تلخص النقاط التالية النطاقات في كتل متداخلة.

  • العناصر المعلنة في الكتلة الخارجية، والقيمة المحددة قبل تعريف الكتلة الداخلية، تكون مرئية داخل الكتلة الداخلية.
  • العناصر المُعلنة في الكتلة الداخلية غير مرئية في الكتلة الخارجية، بل هي مرئية فقط داخل الكتلة الداخلية.
  • يمكن أن تحتوي الكتلة الخارجية والكتلة الداخلية على متغير بنفس الاسم
  • في حالة المتغيرات التي تحمل نفس الاسم، يشير الجزء الداخلي افتراضيًا إلى المتغير المعلن عنه في الجزء الداخلي فقط.
  • إذا أرادت الكتلة الداخلية الإشارة إلى متغير الكتلة الخارجية الذي يحمل نفس اسم متغير الكتلة الداخلية، فيجب تسمية الكتلة الخارجية، ويمكن الإشارة إلى متغير الكتلة الخارجية باسم ' . '.

يساعدك المثال أدناه على فهم المزيد حول هذه النطاقات.

مثال 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' الموجود في الكتلة الخارجية. بما أنه لا يوجد متغير بهذا الاسم في الكتلة الداخلية، فإنه يأخذ القيمة من الكتلة الخارجية افتراضيًا، وبالتالي تتم طباعة رسالة "القيمة قبل الكتلة الداخلية".
  • يتم إسناد القيمة "value after inner block" إلى المتغير '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' كرقم بقيمة ابتدائية "5".
  • Code السطر 5: تسمية الكتلة الداخلية بـ "INNER_BLOCK".
  • Code السطر 7: تعريف متغير 'ln_val' في الكتلة الداخلية كرقم مع القيمة الأولية "3".
  • Code السطر 9: طباعة الفرق في قيمة 'ln_val' بين الكتلة الخارجية والداخلية. . يتم استخدام تنسيق "" للإشارة إلى هذه المتغيرات لتجنب التعارضات الناتجة عن نفس اسم المتغير.

الأسئلة الشائعة

الكتلة المتداخلة هي كتلة مجهولة توضع داخل كتلة أخرى وتعمل بشكل متزامن في مكان ظهورها. برنامج فرعي (الإجراء أو الوظيفة) هي وحدة قابلة لإعادة الاستخدام ومسماة يتم تخزينها بشكل منفصل ويتم استدعاؤها بالاسم، ويمكن استدعاؤها اختيارياً مع المعلمات.

يمكن لكل كتلة أن تحتوي على قسم خاص بها لمعالجة الاستثناءات. يتم التعامل مع الاستثناء الذي يظهر في الكتلة الداخلية أولاً بواسطة تلك الكتلة؛ وإذا لم تتم معالجته، فإنه ينتقل إلى معالج الكتلة الخارجية المحيطة. يتيح لك هذا عزل معالجة الأخطاء لكل كتلة على حدة.

لا يفرض PL/SQL حدًا ثابتًا صغيرًا، لذا يمكن تداخل الكتل البرمجية على مستويات عديدة. عمليًا، يؤثر التداخل العميق سلبًا على سهولة قراءة الكود، لذا يقتصر معظم الكود على مستويين أو ثلاثة مستويات، وينقل المنطق القابل لإعادة الاستخدام إلى برامج فرعية.

يُستخدم مُعرّف الكتلة، الذي يُكتب كاسم بين قوسين زاويين مزدوجين قبل الأمر DECLARE، لتسمية الكتلة. تسمح المُعرّفات للكود الداخلي بتحديد متغير خارجي باستخدام label.variable_name، ويمكن استخدامها أيضًا كأهداف GOTO، مما يُسهّل قراءة الكود المُتداخل وتوثيقه.

نعم. يمكن أن يظهر كتلة متداخلة في أي مكان يُسمح فيه باستخدام عبارة تنفيذية، بما في ذلك داخل حلقة تكرارية، أو فرع شرطي، أو جسم إجراء. يتيح لك هذا تحديد نطاق التصريحات ومعالجة الاستثناءات لجزء الكود الذي يحتاجها فقط.

يُعدّ التداخل أداةً أساسيةً لتنظيم بنية الكود أثناء الترجمة، ولا يُضيف أي عبءٍ يُذكر على وقت التشغيل. فهو يُحسّن من سهولة قراءة الكود وعزل الأخطاء. أما التداخل العميق المفرط، فيؤثر سلبًا على سهولة الصيانة أكثر من تأثيره على سرعة التنفيذ.

نعم. مساعد الطيار جيثب مسودات تحمل علامات الكتل الخارجية والداخلية، بما في ذلك أقسام DECLARE وBEGIN وEXCEPTION، من تعليق. Revانظر إلى تسميات الكتل ونطاق المتغيرات بحيث يتم حل المتغيرات الداخلية والخارجية التي تحمل نفس الاسم كما هو مطلوب.

تقوم مساعدات الذكاء الاصطناعي بتحليل الكتل المتداخلة وتحديد المتغيرات المخفية، والمراجع غير المؤهلة، والوصول خارج النطاق. يُسلط هذا التحليل باستخدام تقنيات التعلم الآلي الضوء على المواضع التي تستخدم فيها كتلة داخلية متغيرًا خاطئًا يحمل نفس الاسم دون تنبيه قبل تنفيذ التعليمات البرمجية.

تلخيص هذه التدوينة بـ: