sql >> Database >  >> RDS >> Oracle

Hebben geneste blokken invloed op de prestaties in PL/SQL-procedures?

Ze lijken niet:

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

Loopt in dezelfde tijd, met telkens een beetje variatie, zoals:

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

Het is natuurlijk mogelijk dat de compiler de overtollige lagen verwijdert, maar ik weet niet zeker of het echt kan met de uitzonderingshandlers daar, omdat dit het resultaat zou beïnvloeden.

Ik heb geen enkele beperking gezien in hoe diep geneste blokken kunnen gaan - de documentatie zegt alleen 'blokken kunnen worden genest'. Het model dat je gebruikt, een specifieke fout opvangen en anderen laten verspreiden, is prima en vrij standaard - hoewel het in je gekunstelde voorbeeld duidelijk niet nodig is, maar dat weet je.




  1. Mysql-update gebaseerd op het bestaan ​​in een andere tabel

  2. Mogelijke manier om lastInsertId van de ene tabel naar de andere op hetzelfde moment of gelijktijdig in te voegen

  3. Wijzig SQL-tabel - sta NULL-kolomwaarde toe

  4. HTML-tabel maken met rowspan van mysql-tabel met één query?