Nie wydaje się, aby:
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
Działa w tym samym czasie, z niewielką zmiennością w każdą stronę, jak:
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
Oczywiście jest możliwe, że kompilator usuwa nadmiarowe warstwy, ale nie jestem pewien, czy naprawdę może to zrobić z tamtejszymi programami obsługi wyjątków, ponieważ wpłynęłoby to na wynik.
Nie widziałem żadnych ograniczeń co do głębokości zagnieżdżonych bloków — dokumentacja mówi tylko, że „bloki mogą być zagnieżdżone”. Model, którego używasz, wyłapywanie konkretnego błędu i pozwolenie innym na rozprzestrzenianie się, jest w porządku i dość standardowy - choć oczywiście w twoim wymyślonym przykładzie nie jest to konieczne, ale wiesz o tym.