De verkar inte:
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
Körs samtidigt, med lite variation åt varje håll, som:
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
Naturligtvis är det möjligt att kompilatorn tar bort de redundanta lagren, men jag är inte säker på att det verkligen kan göra det med undantagshanterarna där eftersom det skulle påverka resultatet.
Jag har inte sett någon begränsning för hur djupt kapslade block kan gå - dokumentationen säger bara "block kan kapslas". Modellen du använder, fångar ett specifikt fel och låter andra sprida sig, är bra och ganska standard - även om det uppenbarligen inte är nödvändigt i ditt konstgjorda exempel, men du vet det.