Variabilní rozsah PL/SQL a vnitřní vnější blok: vnořená struktura

⚡ Chytré shrnutí

Vnořené bloky v PL/SQL umisťují jeden blok do druhého, což umožňuje oddělit složitou logiku a izolovat zpracování výjimek. Pochopení rozsahu platnosti proměnných mezi vnějším a vnitřním blokem a použití popisků bloků zaručuje jednoznačnost proměnných se stejným názvem.

  • 🧱 Vnořený blok: Vnořený blok je blok PL/SQL umístěný uvnitř sekce provádění nebo výjimky jiného bloku.
  • ???? Vnější a vnitřní: Jeden vnější neboli nadřazený blok může obsahovat mnoho vnitřních neboli podřízených bloků, z nichž každý je plnohodnotným blokem PL/SQL.
  • 👁️ Rozsah proměnné: Proměnné vnějšího bloku deklarované před vnitřním blokem jsou viditelné uvnitř něj, ale proměnné vnitřního bloku nejsou viditelné vně něj.
  • ???? ️ Štítky bloků: Označení vnějšího bloku umožňuje vnitřnímu bloku odkazovat na vnější proměnnou se stejným názvem jako label.variable_name.
  • 🛡️ Izolace výjimek: Vnořování umožňuje každému bloku zpracovávat vlastní výjimky,ping ošetření chyb v blízkosti kódu, který ji vyvolává.
  • 🤖 Asistence AI: Asistenti umělé inteligence, jako je GitHub Copilot, v konceptu označují vnořené bloky a označují konflikty v rozsahu proměnných.

Rozsah platnosti proměnných PL/SQL napříč vnořenými vnitřními a vnějšími bloky

Co jsou vnořené bloky Oracle?

In PL / SQLKaždý blok může být vnořen do jiného bloku. Takový blok se označuje jako vnořený blok. Vnořené bloky jsou velmi běžné, když chcete provést určitý proces a zároveň uchovávatping kód pro daný proces v samostatném kontejneru (bloku).

Koncept vnořených bloků pomáhá programátorovi zlepšit čitelnost oddělením složité logiky do jednotlivých bloků a umožňuje... výjimka pro každý blok, který má být zpracován uvnitř hlavního vnějšího bloku.

Vnořená bloková struktura

Blok může být vnořen do jiného bloku. Může být vnořen buď do prováděcí části, nebo do části pro zpracování výjimek a tyto bloky mohou být také označeny. Jeden vnější blok může obsahovat mnoho vnitřních bloků. Každý vnitřní blok je sám o sobě PL/SQL blok, takže všechny vlastnosti a charakteristiky vnitřního bloku jsou stejné jako u vnějšího bloku. Nadřazený blok je hlavní blok a podřízený blok je vnořený blok.

Obrázek níže znázorňuje strukturu vnořených bloků, ve které je nadřazený blok hlavním blokem a podřízený blok vnořeným blokem.

Obrazové znázornění vnořeného bloku v PL/SQL s nadřazeným vnějším blokem a podřízeným vnitřním blokem

Níže je uvedena syntaxe vnořeného bloku. Snímek obrazovky níže ukazuje syntaxi vnořeného bloku s označenými vnějšími a vnitřními bloky.

Syntaxe vnořených bloků zobrazující označené vnější a vnitřní bloky, každý se sekcemi DECLARE, BEGIN a EXCEPTION

Syntaxe vnořených bloků

<<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;
  • Výše uvedená syntaxe ukazuje vnořený blok, který obsahuje celkem dva bloky.
  • Tyto bloky jsou označeny jako „outer_block“ a „inner_block“.

Rozsahy ve vnořeném bloku: Proměnný rozsah

Ve vnořeném bloku je nutné před použitím jasně pochopit rozsah a viditelnost každého bloku. Zejména ve vnitřním bloku jsou viditelné prvky z vnějšího i vnitřního bloku, takže je nezbytné tomu správně porozumět.

Níže uvedené body shrnují rozsahy ve vnořených blocích.

  • Prvky deklarované ve vnějším bloku a hodnota definovaná před definicí vnitřního bloku jsou viditelné uvnitř vnitřního bloku.
  • Prvky deklarované ve vnitřním bloku nejsou viditelné ve vnějším bloku. Jsou viditelné pouze uvnitř vnitřního bloku.
  • Vnější blok a vnitřní blok mohou mít proměnlivý se stejným jménem.
  • V případě proměnných se stejným názvem se vnitřní blok standardně vztahuje pouze na proměnnou deklarovanou ve vnitřním bloku.
  • Pokud se vnitřní blok chce odkazovat na proměnnou vnějšího bloku, která má stejný název jako proměnná vnitřního bloku, pak musí být vnější blok OZNAČEN a na proměnnou vnějšího bloku lze odkazovat jako ' . '.

Níže uvedený příklad vám pomůže lépe porozumět těmto oborům.

Příklad 1: V tomto příkladu vidíme rozsah platnosti proměnných ve vnitřním a vnějším bloku. Také vidíme, jak odkazovat na proměnné pomocí označení bloku.

Níže uvedený snímek obrazovky ukazuje příklad 1, kde vnitřní blok odkazuje na proměnnou vnějšího bloku pomocí označení bloku.

Příklad rozsahu platnosti proměnné ve vnořených blocích odkazujících na vnější blokovou proměnnou pomocí jejího označení bloku

<<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 Vysvětlení:

  • Code řádek 1: Označení vnějšího bloku jako „OUTER_BLOCK“.
  • Code řádek 3: Deklarace proměnné 'var1' jako VARCHAR2 (30) s počáteční hodnotou „outer_block“.
  • Code řádek 4: Deklarace proměnné 'var2' jako VARCHAR2(30) s počáteční hodnotou „hodnota před vnitřním blokem“.
  • Code řádek 6: Označení vnitřního bloku jako „VNITŘNÍ_BLOK“.
  • Code řádek 8: Deklarace proměnné 'var1' ve vnitřním bloku jako VARCHAR2 (30) s počáteční hodnotou „inner_block“.
  • Code řádek 10: Výpis hodnoty proměnné 'var1'. Protože není uveden žádný popisek, standardně se hodnota přebírá z vnitřního bloku, a proto se vypíše zpráva 'inner_block'.
  • Code řádek 11: Výpis hodnoty proměnné vnějšího bloku 'var1'. Protože vnitřní blok má proměnnou se stejným názvem, odkazujeme na popisek vnějšího bloku. Vypíše se tedy zpráva 'outer_block'.
  • Code řádek 12: Výpis hodnoty proměnné vnějšího bloku 'var2'. Protože ve vnitřním bloku není žádná proměnná s tímto názvem, standardně se hodnota přebírá z vnějšího bloku, a proto se vypíše zpráva 'hodnota před vnitřním blokem'.
  • Proměnné 'var2' ve vnějším bloku je přiřazena hodnota 'hodnota po vnitřním bloku'. Toto přiřazení se však děje po definici vnitřního bloku, takže tato hodnota uvnitř vnitřního bloku není přítomna.

Příklad 2: V tomto příkladu najdeme rozdíl mezi dvěma čísly, jedním deklarovaným ve vnějším bloku a druhým ve vnitřním bloku. Obě mají stejný název. Podívejme se, jak je označení bloku užitečné při odkazování na tyto proměnné.

Níže uvedený snímek obrazovky ukazuje příklad 2, který vypočítává rozdíl mezi vnějšími a vnitřními proměnnými bloku se stejným názvem.

Příklad výpočtu rozdílu mezi vnějšími a vnitřními blokovými proměnnými stejného názvu pomocí popisků bloků

<<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 Vysvětlení:

  • Code řádek 1: Označení vnějšího bloku jako „OUTER_BLOCK“.
  • Code řádek 3: Deklarace proměnné 'ln_val' jako NUMBER s počáteční hodnotou „5“.
  • Code řádek 5: Označení vnitřního bloku jako „VNITŘNÍ_BLOK“.
  • Code řádek 7: Deklarace proměnné 'ln_val' ve vnitřním bloku jako NUMBER s počáteční hodnotou „3“.
  • Code řádek 9: Výpis rozdílu hodnoty 'ln_val' z vnějšího a vnitřního bloku. Funkce „ . Pro odkazování na tyto proměnné se používá formát ”, aby se předešlo konfliktům způsobeným stejným názvem proměnné.

Nejčastější dotazy

Vnořený blok je anonymní blok umístěný uvnitř jiného bloku a spouštěný v rámci svého umístění. podprogram (procedura nebo funkce) je pojmenovaná, opakovaně použitelná jednotka, která je uložena samostatně a volána jménem, ​​volitelně s parametry.

Každý blok může mít svou vlastní sekci EXCEPTION. Výjimka vyvolaná ve vnitřním bloku je nejprve ošetřena tímto blokem; pokud není ošetřena, šíří se do obslužné rutiny vnějšího bloku, který ji obklopuje. To umožňuje izolovat ošetření chyb pro každý blok.

PL/SQL nestanovuje malý pevný limit, takže bloky lze vnořovat o mnoho úrovní hluboko. V praxi hluboké vnořování zhoršuje čitelnost, takže většina kódu se drží vnořování na dvou nebo třech úrovních a přesouvá opakovaně použitelnou logiku do podprogramů.

Popisek bloku, zapsaný jako název v dvojitých lomených závorkách před DECLARE, pojmenovává blok. Popisky umožňují vnitřnímu kódu kvalifikovat vnější proměnnou jako popisek.název_proměnné a mohou také sloužit jako cíle GOTO, což usnadňuje čtení a dokumentaci vnořeného kódu.

Ano. Vnořený blok se může objevit kdekoli, kde je povolen spustitelný příkaz, včetně smyčky, větve IF nebo těla procedury. To umožňuje omezit deklarace a zpracování výjimek pouze na tu část kódu, která je potřebuje.

Vnořování je hlavně nástroj pro strukturování v době kompilace a samo o sobě nepřidává žádné významné běhové náklady. Zlepšuje čitelnost a izolaci chyb. Nadměrné hluboké vnořování většinou snižuje údržbu spíše než rychlost.

Ano. GitHub Copilot koncepty označené jako vnější a vnitřní bloky, včetně sekcí DECLARE, BEGIN a EXCEPTION, z komentáře. Revzobrazit popisky bloků a rozsah proměnných, aby se stejně pojmenované vnitřní a vnější proměnné vyřešily podle očekávání.

Asistenti umělé inteligence analyzují vnořené bloky a označují stínované proměnné, nekvalifikované odkazy a přístup mimo rozsah. Tato recenze strojového učení zdůrazňuje místa, kde vnitřní blok tiše používá nesprávnou proměnnou se stejným názvem před spuštěním kódu.

Shrňte tento příspěvek takto: