De ser ikke ud til at:
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ører på samme tid, med lidt variation hver vej, 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
Det er selvfølgelig muligt, at compileren fjerner de overflødige lag, men jeg er ikke sikker på, at den virkelig kan med undtagelsesbehandlerne der, da det ville påvirke resultatet.
Jeg har ikke set nogen begrænsning for, hvor dybt indlejrede blokke kan gå - dokumentationen siger bare 'blokke kan indlejres'. Den model, du bruger, fanger en specifik fejl og lader andre udbrede sig, er fin og ret standard - selvom det naturligvis ikke er nødvendigt i dit konstruerede eksempel, men du ved det.