Область переменных 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;
- Приведённый выше синтаксис показывает вложенный блок, содержащий в общей сложности два блока.
- Эти блоки обозначены как 'outer_block' и 'inner_block'.
Области действия во вложенном блоке: область действия переменной
При использовании вложенных блоков необходимо четко понимать область видимости и структуру каждого блока. В частности, во внутреннем блоке видны элементы как внешнего, так и внутреннего блока, поэтому необходимо правильно понимать это.
Ниже приведено краткое описание областей действия вложенных блоков.
- Элементы, объявленные во внешнем блоке, а также значение, определенное перед определением внутреннего блока, видны внутри внутреннего блока.
- Элементы, объявленные во внутреннем блоке, не видны во внешнем блоке. Они видны только внутри внутреннего блока.
- Внешний и внутренний блоки могут иметь переменная с таким же именем.
- В случае переменных с одинаковым именем внутренний блок по умолчанию ссылается только на переменную, объявленную во внутреннем блоке.
- Если внутренний блок хочет сослаться на переменную внешнего блока, имеющую то же имя, что и переменная внутреннего блока, то внешний блок должен быть помечен (LABELTED), и на переменную внешнего блока можно ссылаться как ' . '.
Приведённый ниже пример поможет вам лучше понять эти области видимости.
Пример 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' из внешнего и внутреннего блоков. . Для обозначения этих переменных используется формат "", чтобы избежать конфликтов из-за одинаковых имен переменных.




