sql >> Databasteknik >  >> RDS >> Oracle

Oracle PL/SQL - Är NO_DATA_FOUND undantag dåliga för prestanda för lagrad procedur?

Jag skulle inte använda en explicit markör för att göra detta. Steve F. råder inte längre människor att använda explicita markörer när en implicit markör kan användas.

Metoden med count(*) är osäker. Om en annan session tar bort raden som uppfyllde villkoret efter raden med count(*) , och före raden med select ... into , kommer koden att skapa ett undantag som inte kommer att hanteras.

Den andra versionen från det ursprungliga inlägget har inte detta problem, och det är i allmänhet att föredra.

Som sagt, det finns en mindre overhead med undantaget, och om du är 100 % säker på att data inte kommer att ändras kan du använda count(*) , men jag avråder från det.

Jag körde dessa riktmärken på Oracle 10.2.0.132-bitars Windows . Jag tittar bara på förfluten tid. Det finns andra testselar som kan ge mer detaljer (som t.ex. låstal och använda minne).

SQL>create table t (NEEDED_FIELD number, COND number);
SQL>insert into t (NEEDED_FIELD, cond) values (1, 0);
declare
  otherVar  number;
  cnt number;
begin
  for i in 1 .. 50000 loop
     select count(*) into cnt from t where cond = 1;

     if (cnt = 1) then
       select NEEDED_FIELD INTO otherVar from t where cond = 1;
     else
       otherVar := 0;
     end if;
   end loop;
end;
/
declare
  otherVar  number;
begin
  for i in 1 .. 50000 loop
     begin
       select NEEDED_FIELD INTO otherVar from t where cond = 1;
     exception
       when no_data_found then
         otherVar := 0;
     end;
   end loop;
end;
/


  1. Bästa sättet att göra kapslad case-satslogik i SQL Server

  2. Överträdelse av integritetsbegränsning:1052 kolumn "id" där klausulen är tvetydig

  3. PostgreSQL-scheman / namnutrymmen med Django

  4. Hur installerar jag Oracle Instant Client på en Mac?