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

Що таке вкладені блоки Oracle?
In PL / SQL, кожен блок може бути вкладений всередину іншого блоку. Такий блок називається вкладеним блоком. Вкладені блоки дуже поширені, коли потрібно виконати певний процес, зберігаючиping код для цього процесу в окремому контейнері (блоці).
Концепція вкладених блоків допомагає програмісту покращити читабельність, розділяючи складну логіку на окремі блоки, і це дозволяє виняток для кожного блоку, який обробляється всередині головного зовнішнього блоку.
Вкладена блочна структура
Блок може бути вкладений всередину іншого блоку. Він може бути вкладений або в частину виконання, або в частину обробки винятків, і ці блоки також можуть бути позначені. Один зовнішній блок може містити багато внутрішніх блоків. Кожен внутрішній блок сам по собі є Блок PL/SQL, тому всі властивості та характеристики внутрішнього блоку такі ж, як і у зовнішнього блоку. Батьківський блок є основним блоком, а дочірній блок — вкладеним блоком.
На зображенні нижче наведено ілюстративне представлення структури вкладених блоків, у якій батьківський блок є основним блоком, а дочірній блок – вкладеним блоком.
Нижче наведено синтаксис вкладеного блоку. На знімку екрана нижче показано синтаксис вкладеного блоку з позначеними зовнішнім та внутрішнім блоками.
Синтаксис вкладеного блоку
<<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' із зовнішнього та внутрішнього блоків. . Для посилання на ці змінні використовується формат ”, щоб уникнути конфліктів через однакові імена змінних.




