Область змінної PL/SQL і внутрішній зовнішній блок: вкладена структура

⚡ Розумний підсумок

Вкладені блоки в PL/SQL розміщують один блок всередині іншого, що дозволяє розділяти складну логіку та ізолювати обробку винятків. Розуміння області видимості змінних між зовнішнім та внутрішнім блоками, а також використання міток блоків, забезпечує однозначність однакових змінних.

  • 🧱 Вкладений блок: Вкладений блок — це блок PL/SQL, розміщений всередині секції виконання або винятку іншого блоку.
  • ???? Зовнішній та внутрішній: Один зовнішній, або батьківський, блок може містити багато внутрішніх, або дочірніх, блоків, кожен з яких є повноцінним блоком PL/SQL.
  • 👁️ Змінна область видимості: Зовнішні блокові змінні, оголошені перед внутрішнім блоком, видимі всередині нього, але внутрішні блокові змінні не видимі зовні.
  • 🏷️ Мітки блоків: Позначення зовнішнього блоку дозволяє внутрішньому блоку посилатися на зовнішню змінну з такою ж назвою, як label.variable_name.
  • 🛡️ Ізоляція винятків: Вкладеність дозволяє кожному блоку обробляти власні винятки, зберігаючиping обробка помилок поблизу коду, який її викликає.
  • 🤖 Допомога AI: Помічники штучного інтелекту, такі як GitHub Copilot, позначають вкладені блоки як чернетки та позначають конфлікти змінних у області видимості.

Область дії змінних 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;
  • Наведений вище синтаксис показує вкладений блок, який містить загалом два блоки.
  • Ці блоки позначені як «зовнішній_блок» та «внутрішній_блок».

Області у вкладеному блоці: область змінної

У вкладеному блоці вам потрібно чітко розуміти область дії та видимість кожного блоку, перш ніж використовувати їх. Зокрема, у внутрішньому блоці видно елементи як із зовнішнього, так і із внутрішнього блоку, тому необхідне правильне розуміння цього.

Наведені нижче пункти підсумовують області дії у вкладених блоках.

  • Елементи, оголошені у зовнішньому блоці, та значення, визначене перед визначенням внутрішнього блоку, видно всередині внутрішнього блоку.
  • Елементи, оголошені у внутрішньому блоці, не видно у зовнішньому блоці. Вони видно лише у внутрішньому блоці.
  • Зовнішній блок і внутрішній блок можуть мати змінна з такою ж назвою.
  • У випадку змінних з однаковими іменами, внутрішній блок за замовчуванням посилається лише на змінну, оголошену у внутрішньому блоці.
  • Якщо внутрішній блок хоче посилатися на змінну зовнішнього блоку, яка має таку ж назву, як і змінна внутрішнього блоку, тоді зовнішній блок повинен бути ПОЗНАЧЕНИЙ, а на змінну зовнішнього блоку можна посилатися як ' . '.

Наведений нижче приклад допоможе вам краще зрозуміти ці області застосування.

Приклад 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: Позначення внутрішнього блоку як «ВНУТРІШНІЙ_БЛОК».
  • Code рядок 8: Оголошення змінної 'var1' у внутрішньому блоці як VARCHAR2(30) з початковим значенням “inner_block”.
  • Code рядок 10: Виведення значення 'var1'. Оскільки мітка не згадується, за замовчуванням значення береться з внутрішнього блоку, отже, виводиться повідомлення 'inner_block'.
  • Code рядок 11: Виведення значення зовнішньої блочної змінної 'var1'. Оскільки внутрішній блок має змінну з такою ж назвою, ми звертаємося до мітки зовнішнього блоку. Таким чином, виводиться повідомлення 'outer_block'.
  • Code рядок 12: Виведення значення зовнішньої блочної змінної 'var2'. Оскільки у внутрішньому блоці немає змінної з такою назвою, за замовчуванням значення береться із зовнішнього блоку, отже, виводиться повідомлення 'значення перед внутрішнім блоком'.
  • Змінній 'var2' у зовнішньому блоці присвоюється значення 'value after inner block'. Але це присвоєння відбувається після визначення внутрішнього блоку, тому це значення відсутнє всередині внутрішнього блоку.

Приклад 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: Позначення внутрішнього блоку як «ВНУТРІШНІЙ_БЛОК».
  • Code рядок 7: Оголошення змінної 'ln_val' у внутрішньому блоці як NUMBER з початковим значенням «3».
  • Code рядок 9: Виведення різниці значень 'ln_val' із зовнішнього та внутрішнього блоків. . Для посилання на ці змінні використовується формат ”, щоб уникнути конфліктів через однакові імена змінних.

Поширені запитання

Вкладений блок — це анонімний блок, розміщений всередині іншого блоку та виконується всередині, де він з'являється. підпрограма (процедура або функція) — це іменована, повторно використовувана одиниця, яка зберігається окремо та викликається за іменем, за бажанням з параметрами.

Кожен блок може мати власний розділ EXCEPTION. Виняток, викликаний у внутрішньому блоці, спочатку обробляється цим блоком; якщо він не оброблений, він поширюється на обробник зовнішнього блоку, що його оточує. Це дозволяє ізолювати обробку помилок для кожного блоку.

PL/SQL не накладає невеликих фіксованих обмежень, тому блоки можуть бути вкладені на багато рівнів. На практиці глибоке вкладення погіршує читабельність, тому більшість коду вкладається на двох або трьох рівнях і переміщує логіку повторного використання в підпрограми.

Мітка блоку, записана як ім'я в подвійних кутових дужках перед DECLARE, іменує блок. Мітки дозволяють внутрішньому коду кваліфікувати зовнішню змінну як label.variable_name, а також можуть служити цілями GOTO, що спрощує читання та документування вкладеного коду.

Так. Вкладений блок може з'являтися будь-де, де дозволено виконуваний оператор, зокрема всередині циклу, гілки IF або тіла процедури. Це дозволяє вам розширити область дії оголошень та обробки винятків лише до тієї частини коду, яка їх потребує.

Вкладеність — це переважно інструмент структурування під час компіляції, який сам по собі не додає суттєвих накладних витрат під час виконання. Вона покращує читабельність та ізоляцію помилок. Надмірна глибока вкладеність здебільшого знижує вартість підтримки, а не швидкості.

Так. Копілот GitHub чернетки з позначками зовнішні та внутрішні блоки, включаючи розділи DECLARE, BEGIN та EXCEPTION, з коментаря. Revпереглянути мітки блоків та область видимості змінних, щоб внутрішні та зовнішні змінні з однаковими іменами розв'язувалися належним чином.

Помічники штучного інтелекту аналізують вкладені блоки та позначають затінені змінні, некваліфіковані посилання та доступ поза областю видимості. Цей огляд машинного навчання висвітлює місця, де внутрішній блок непомітно використовує неправильну змінну з такою ж назвою перед виконанням коду.

Підсумуйте цей пост за допомогою: