Обхват на PL/SQL променлива и вътрешен външен блок: вложена структура
Какво е вложени блокове Oracle?
В PL/SQL всеки блок може да бъде вложен в друг блок. Те се наричат вложен блок. Вложените блокове са много чести, когато искаме да изпълним определен процес, като в същото време кодът за тези процеси трябва да се съхранява в отделен контейнер (блок).
Концепцията за вложени блокове ще помогне на програмиста да подобри четливостта чрез разделяне на сложните неща във всеки блок и да обработва изключението за всеки блок вътре в основния външен блок.
Вложена блокова структура
Един блок може да бъде вложен в друг блок. Това може да бъде вложено или в частта за изпълнение, или в обработка на изключения част. Тези блокове също могат да бъдат етикетирани. Един външен блок може да съдържа много вътрешни блокове. Всеки вътрешен блок отново е a 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“
Обхвати във вложен блок: Променлив обхват
При вложен блок трябва ясно да разберете обхвата и видимостта на всеки блок, преди да ги използвате. По-специално във вътрешния блок, елементите както от външния, така и от вътрешния блок ще бъдат видими, следователно е необходимо правилното разбиране на това.
Точките по-долу ще обобщят повече относно обхватите във вложените блокове.
- Елементите, декларирани във външния блок, и стойността, която е дефинирана преди дефиницията на вътрешния блок, се виждат във вътрешния блок.
- Елементите, декларирани във вътрешния блок, не се виждат във външния блок. Те се виждат само във вътрешния блок.
- Външният и вътрешният блок могат да имат променлива със същото име.
- В случай на променливи с едно и също име, вътрешният блок по подразбиране ще препраща само към променливата, декларирана във вътрешния блок.
- Ако вътрешният блок иска да препрати променливата на външния блок, която има същото име като това на вътрешния блок, тогава външният блок трябва да бъде ОЗНАЧЕЕН, а променливата на външния блок може да бъде посочена като ' . '
Примерът по-долу ще ви помогне да разберете повече за тези обхвати.
Пример 1: В този пример ще видим обхвата на променливите във вътрешния и външния блок. Също така ще видим как да препращаме променливите с помощта на етикет на блок.
<<OUTER_BLOC>> DECLARE varl VARCHAR2(30):='outer_block'; var2 VARCHAR2(30):='value before inner block’; BEGIN <<NNER_BLOCK>> DECLARE varl VARCHAR2(30):='inner_block'; BEGIN dbms_output.put_line(varl), dbms_output.put_line(OUTER_BLOCKvar1); dbms_output.put_line(var2); END; var2:='value after inner block'; END; /
Обяснение на кода:
- Кодов ред 1: Маркиране на външния блок като „OUTER_BLOCK“.
- Кодов ред 3: Деклариране на променлива 'var1' като VARCHAR2 (30) с начална стойност на "външен блок".
- Кодов ред 4: Деклариране на променлива 'var2' като VARCHAR2 (30) с начална стойност на “стойност преди вътрешен блок”.
- Кодов ред 6: Етикетиране на вътрешния блок като „INNER_BLOCK“
- Кодов ред 8: Деклариране на променлива „var1“ във вътрешния блок като VARCHAR2 (30) с начална стойност „вътрешен блок“.
- Кодов ред 10: Отпечатване на стойността на „var1“. Тъй като по подразбиране не се споменава етикет, той ще вземе стойността от вътрешен блок, следователно ще отпечата съобщение „inner_block“.
- Кодов ред 11: Отпечатване на стойността на външната блокова променлива 'var1'. Тъй като вътрешният блок има променлива със същото име, трябва да се обърнем към етикета на външния блок. По този начин се отпечатва съобщението „външен блок“.
- Кодов ред 12: Отпечатване на стойността на външната блокова променлива 'var2'. Тъй като във вътрешния блок няма променлива с това име, по подразбиране тя ще вземе стойността от външен блок, следователно ще отпечата съобщение „стойност преди вътрешен блок“.
- На променливата „var2“ във външния блок е присвоена стойността „стойност след вътрешен блок“. Но това присвояване се случи след дефинирането на вътрешен блок. Следователно тази стойност не присъства във вътрешния блок.
Пример 2: В този пример ще намерим разликата между две числа, едно декларирано във външния блок и друго във вътрешния блок. И двете ще имат едно и също име. Нека видим как етикетът на блока е полезен при препращане към тези променливи.
<<OUTER_BLOC>> DECLARE ln_val NUMBER :=5; BEGIN <<INNERBLOC>> 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; /
Обяснение на кода:
- Кодов ред 1: Маркиране на външния блок като „OUTER_BLOCK“.
- Кодов ред 3: Деклариране на променлива 'ln_val' като NUMBER с начална стойност "5".
- Кодов ред 5: Етикетиране на вътрешния блок като „INNER_BLOCK“
- Кодов ред 7: Деклариране на променлива 'ln_val' във вътрешния блок като NUMBER с начална стойност "3".
- Кодов ред 9: Отпечатване на разликата в стойността на 'ln_val' от външния и вътрешния блок. „ . ” форматът се използва за препращане към тези променливи, за да се избегнат конфликти поради едно и също име на променлива.
Oбобщение
В този урок научихме как да създадем вложен блок и как да управляваме обхвата във вътрешния блок и външните блокове. Видяхме също пример, при който променливите от вътрешния и външния блок бяха препратени вътре във вътрешния блок.




