Oracle
 sql >> Database >  >> RDS >> Oracle

I blocchi nidificati hanno un impatto sulle prestazioni nelle procedure PL/SQL?

Non sembrano:

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

Funziona nello stesso tempo, con un po' di variazione in ogni modo, come:

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

Ovviamente è possibile che il compilatore stia rimuovendo i livelli ridondanti, ma non sono sicuro che possa farlo davvero con i gestori di eccezioni lì poiché influenzerebbe il risultato.

Non ho visto alcuna limitazione su quanto possono andare in profondità i blocchi nidificati:la documentazione dice solo "i blocchi possono essere nidificati". Il modello che stai usando, rilevando un errore specifico e lasciando che gli altri si propaghino, va bene e piuttosto standard, anche se ovviamente nel tuo esempio inventato non è necessario, ma lo sai.