Область переменных PL/SQL и внутренний внешний блок: вложенная структура

⚡ Умное резюме

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

  • 🧱 Вложенный блок: Вложенный блок — это блок PL/SQL, помещенный внутрь секции выполнения или обработки исключений другого блока.
  • ???? Внешнее и внутреннее: Один внешний, или родительский, блок может содержать множество внутренних, или дочерних, блоков, каждый из которых представляет собой полный блок PL/SQL.
  • 👁️ Переменная область видимости: Переменные внешнего блока, объявленные перед внутренним блоком, видны внутри него, но переменные внутреннего блока не видны снаружи.
  • 🏷️ Метки блоков: Добавление метки к внешнему блоку позволяет внутреннему блоку ссылаться на переменную внешнего блока с тем же именем, используя label.variable_name.
  • 🛡️ Изоляция исключений: Вложенность позволяет каждому блоку обрабатывать собственные исключения, обеспечивая...ping Обработка ошибок происходит вблизи кода, который их вызывает.
  • 🤖 Помощь ИИ: Искусственный интеллект, используемый такими помощниками, как 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;
  • Приведённый выше синтаксис показывает вложенный блок, содержащий в общей сложности два блока.
  • Эти блоки обозначены как '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' из внешнего и внутреннего блоков. . Для обозначения этих переменных используется формат "", чтобы избежать конфликтов из-за одинаковых имен переменных.

Часто задаваемые вопросы (FAQ)

Вложенный блок — это анонимный блок, помещенный внутрь другого блока и расположенный в том месте, где он появляется. подпрограмма (Процедура или функция) — это именованный, многократно используемый модуль, который хранится отдельно и вызывается по имени, при необходимости с параметрами.

Каждый блок может иметь свой собственный раздел EXCEPTION. Исключение, возникшее во внутреннем блоке, обрабатывается этим блоком в первую очередь; если оно не обработано, оно передается обработчику внешнего блока, окружающего блок. Это позволяет изолировать обработку ошибок для каждого блока.

PL/SQL не устанавливает небольшого фиксированного ограничения, поэтому блоки кода могут быть вложены на много уровней. На практике глубокая вложенность ухудшает читаемость, поэтому большая часть кода ограничивается двумя или тремя уровнями вложенности, а многократно используемая логика выносится в подпрограммы.

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

Да. Вложенный блок может располагаться везде, где разрешено выполнение операторов, включая циклы, ветвления IF или тело процедуры. Это позволяет ограничить объявления и обработку исключений только той частью кода, которая в них нуждается.

Вложенность — это, в основном, инструмент структурирования на этапе компиляции, сам по себе он не добавляет существенных накладных расходов во время выполнения. Он улучшает читаемость и изоляцию ошибок. Чрезмерная глубина вложенности в основном снижает удобство сопровождения, а не скорость.

Да. Второй пилот GitHub Черновики, помеченные как внешние и внутренние блоки, включая разделы DECLARE, BEGIN и EXCEPTION, взяты из комментария. RevПросмотрите метки блоков и область видимости переменных, чтобы внутренние и внешние переменные с одинаковыми именами обрабатывались должным образом.

Искусственный интеллект анализирует вложенные блоки и помечает затененные переменные, неквалифицированные ссылки и доступ за пределы области видимости. Этот анализ с помощью машинного обучения выявляет места, где внутренний блок незаметно использует переменную с тем же именем до выполнения кода.

Подведем итог этой публикации следующим образом: