次のようには表示されません:
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
もちろん、コンパイラが冗長なレイヤーを削除している可能性はありますが、結果に影響を与えるため、例外ハンドラーを使用して実際に削除できるかどうかはわかりません。
ネストされたブロックの深さに関する制限は見ていません。ドキュメントには、「ブロックをネストできる」とだけ記載されています。使用しているモデルは、特定のエラーをキャッチして他のエラーを伝播させるので、問題なく、かなり標準的です。ただし、考案した例では明らかに必要ありませんが、それはわかっています。