Те не изглеждат:
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
Изпълнява се по едно и също време, с малко вариации във всяка посока, като:
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
Разбира се, възможно е компилаторът да премахва излишните слоеве, но не съм сигурен, че наистина може с манипулаторите на изключения там, тъй като това би повлияло на резултата.
Не съм виждал никакво ограничение за това колко дълбоко могат да бъдат вложените блокове - документацията просто казва „блоковете могат да бъдат вложени“. Моделът, който използвате, улавяйки конкретна грешка и оставяйки другите да се разпространят, е добър и доста стандартен - въпреки че очевидно във вашия измислен пример не е необходимо, но вие знаете това.