Nezdá se, že:
set timing on
set serveroutput on
declare
x number := 0;
begin
dbms_output.put_line('No inner blocks');
for i in 1..1000000 loop
x := x + 1;
end loop;
dbms_output.put_line(x);
end;
/
anonymous block completed
Elapsed: 00:00:00.095
No inner blocks
1000000
Běží ve stejnou dobu, s trochou variací v každém směru, jako:
declare
x number := 0;
begin
dbms_output.put_line('Nested inner blocks');
for i in 1..1000000 loop
begin
begin
begin
begin
x := x + 1;
exception
when others then
raise;
end;
exception
when others then
raise;
end;
exception
when others then
raise;
end;
exception
when others then
raise;
end;
end loop;
dbms_output.put_line(x);
end;
/
anonymous block completed
Elapsed: 00:00:00.090
Nested inner blocks
1000000
Samozřejmě je možné, že kompilátor odstraňuje nadbytečné vrstvy, ale nejsem si jistý, že to opravdu dokáže s obslužnými rutinami výjimek, protože by to ovlivnilo výsledek.
Neviděl jsem žádné omezení toho, jak hluboko mohou vnořené bloky jít - dokumentace jen říká, že bloky mohou být vnořeny. Model, který používáte, zachycení konkrétní chyby a umožnění šíření ostatním, je v pořádku a docela standardní - i když ve vašem vymyšleném příkladu to samozřejmě není nutné, ale víte to.