Oracle
 sql >> Base de données >  >> RDS >> Oracle

Les blocs imbriqués ont-ils un impact sur les performances dans les procédures PL/SQL ?

Ils ne semblent pas :

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

Fonctionne en même temps, avec un peu de variation dans chaque sens, comme :

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

Bien sûr, il est possible que le compilateur supprime les couches redondantes, mais je ne suis pas sûr qu'il le puisse vraiment avec les gestionnaires d'exceptions car cela affecterait le résultat.

Je n'ai vu aucune limitation sur la profondeur des blocs imbriqués - la documentation dit simplement que "les blocs peuvent être imbriqués". Le modèle que vous utilisez, captant une erreur spécifique et laissant les autres se propager, est correct et assez standard - bien qu'évidemment dans votre exemple artificiel ce ne soit pas nécessaire, mais vous le savez.