Ze lijken niet:
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
Loopt in dezelfde tijd, met telkens een beetje variatie, zoals:
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
Het is natuurlijk mogelijk dat de compiler de overtollige lagen verwijdert, maar ik weet niet zeker of het echt kan met de uitzonderingshandlers daar, omdat dit het resultaat zou beïnvloeden.
Ik heb geen enkele beperking gezien in hoe diep geneste blokken kunnen gaan - de documentatie zegt alleen 'blokken kunnen worden genest'. Het model dat je gebruikt, een specifieke fout opvangen en anderen laten verspreiden, is prima en vrij standaard - hoewel het in je gekunstelde voorbeeld duidelijk niet nodig is, maar dat weet je.