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

Oracle PL/SQL - Er NO_DATA_FOUND undtagelser dårlige for ydelse af lagrede procedurer?

Jeg ville ikke bruge en eksplicit markør til at gøre dette. Steve F. råder ikke længere folk til at bruge eksplicitte markører, når en implicit markør kunne bruges.

Metoden med count(*) er usikker. Hvis en anden session sletter rækken, der opfyldte betingelsen efter linjen med count(*) , og før linjen med select ... into , vil koden kaste en undtagelse, som ikke bliver håndteret.

Den anden version fra det originale indlæg har ikke dette problem, og det foretrækkes generelt.

Når det er sagt, er der en mindre overhead ved at bruge undtagelsen, og hvis du er 100 % sikker på, at dataene ikke ændres, kan du bruge count(*) , men jeg fraråder det.

Jeg kørte disse benchmarks på Oracle 10.2.0.132 bit Windows . Jeg ser kun på forløbet tid. Der er andre testseler, der kan give flere detaljer (såsom låsetæller og brugt hukommelse).

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. Hvordan man ikke bygger PostgreSQL 9.0-udvidelser på RPM-platforme

  2. oracledb chaining sql call ved hjælp af løfter

  3. SELECT med forespørgselsvariabler, der ikke bruger INDEX'er

  4. Kommandolinje PHP mysql_connect() fejl