Mereka tampaknya tidak:
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
Berjalan dalam waktu yang sama, dengan sedikit variasi di setiap arah, seperti:
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
Tentu saja mungkin kompiler menghapus lapisan yang berlebihan, tetapi saya tidak yakin itu benar-benar dapat dilakukan dengan penangan pengecualian di sana karena akan mempengaruhi hasilnya.
Saya belum melihat batasan tentang seberapa dalam blok bersarang - dokumentasi hanya mengatakan 'blok dapat bersarang'. Model yang Anda gunakan, menangkap kesalahan tertentu dan membiarkan orang lain menyebar, baik-baik saja dan cukup standar - meskipun jelas dalam contoh Anda yang dibuat-buat itu tidak perlu, tetapi Anda tahu itu.