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

⚡ Умно обобщение

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

  • 🧱 Вложен блок: Вложен блок е PL/SQL блок, поставен в секцията за изпълнение или изключения на друг блок.
  • 🌳 Външно и вътрешно: Един външен или родителски блок може да съдържа много вътрешни или дъщерни блокове, всеки от които е пълен PL/SQL блок.
  • 👁️ Обхват на променливата: Променливите на външния блок, декларирани преди вътрешен блок, са видими вътре в него, но променливите на вътрешния блок не са видими отвън.
  • ???? ️ Етикети на блокове: Етикетирането на външния блок позволява на вътрешния блок да се позовава на външна променлива със същото име като label.variable_name.
  • Изолиране на изключения: Влагането позволява на всеки блок да обработва свои собствени изключения, keeping обработка на грешки близо до кода, който ги поражда.
  • 🤖 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: Етикетиране на вътрешния блок като „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' от външния и вътрешния блок. Функцията „ . „Форматът ” се използва за обозначаване на тези променливи, за да се избегнат конфликти, дължащи се на едно и също име на променлива.

Въпроси и Отговори

Вложен блок е анонимен блок, поставен вътре в друг блок и изпълняван в кода, където се появява. подпрограма (процедура или функция) е именувана, многократно използваема единица, която се съхранява отделно и се извиква по име, по избор с параметри.

Всеки блок може да има своя собствена секция EXCEPTION. Изключение, генерирано във вътрешния блок, се обработва първо от този блок; ако не се обработи, то се разпространява към обработчика на външния блок, който го обхваща. Това ви позволява да изолирате обработката на грешки за всеки блок.

PL/SQL не налага малко фиксирано ограничение, така че блоковете могат да бъдат вложени на много нива дълбоко. На практика дълбокото влагане вреди на четимостта, така че повечето кодове поддържат влагане на две или три нива и преместват логиката за многократна употреба в подпрограми.

Етикетът на блок, записан като име в двойни ъглови скоби преди DECLARE, именува блок. Етикетите позволяват на вътрешния код да квалифицира външна променлива като label.variable_name и могат да служат и като GOTO цели, което прави вложения код по-лесен за четене и документиране.

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

Влагането е основно инструмент за структуриране по време на компилация и само по себе си не добавя значителни разходи по време на изпълнение. То подобрява четимостта и изолирането на грешките. Прекомерното дълбоко влагане най-вече струва поддръжката, а не чистата скорост.

Да. Копилот на GitHub чернови, обозначени като външни и вътрешни блокове, включително секции DECLARE, BEGIN и EXCEPTION, от коментар. RevВижте етикетите на блоковете и обхвата на променливите, така че вътрешните и външните променливи с еднакви имена да се разрешат по предназначение.

Асистентите с изкуствен интелект анализират вложени блокове и маркират скрити променливи, неквалифицирани препратки и достъп извън обхвата. Този преглед на машинното обучение подчертава места, където вътрешен блок тихо използва грешна променлива със същото име, преди кодът да се изпълни.

Обобщете тази публикация с: