Ser ud til at være en god variant i tilfælde af, at der er indeks på mindst effective_start_date
og effective_end_date
felter af per_all_people_f
tabel.
Ideel variant til denne forespørgsel er
create index x_per_all_people_search on per_all_people_f(
effective_start_date,
effective_end_date,
person_id,
emp_flag
)
men det kan være for dyrt at vedligeholde (diskomkostninger, indsættelseshastighed).
Desuden skal markøren i pakketeksten indeholde underforespørgsel og genbruge funktionsopkaldsresultater:
cursor cur_var
is
select
EMP_2012,
EMP_2013,
(EMP_2013 - EMP_2012) Diff
from (
select
function_name('01-MAR-2012','31-MAY-2012') EMP_2012,
function_name('01-MAR-2013','31-MAY-2013') EMP_2013
from dual
);
Den bedste løsning er selvfølgelig at minimere kontekstskift og få alle værdier fra en enkelt SQL-forespørgsel. Du kan også angive parametre direkte til markøren:
cursor cur_var(
start_1 date, end_1 date,
start_2 date, end_2 date
)
is
select
EMP_2012,
EMP_2013,
(EMP_2013 - EMP_2012) Diff
from (
select
(
select
count(distinct papf.person_id)
from
per_all_people_f papf
where
papf.emp_flag = 'Y'
and
effective_start_date >= trunc(start_1)
and
effective_end_date <= trunc(end_1)
) EMP_2012,
(
select
count(distinct papf.person_id)
from
per_all_people_f papf
where
papf.emp_flag = 'Y'
and
effective_start_date >= trunc(start_2)
and
effective_end_date <= trunc(end_2)
) EMP_2013
from dual
);
Fra mit synspunkt er funktions-/markørparametre for generiske, det kan være bedre at lave en indpakning, der tager som inputparametre kvartalsnummer og to år at sammenligne.
Og sidst, hvis resultater, der er planlagt til at blive brugt i PL/SQL (jeg formoder, at på grund af at returnere en enkelt række) slet ikke bruger markøren, skal du bare returnere beregnede værdier gennem outputparametre. Fra et andet synspunkt, hvis du har brug for at få kvartalsdata for hele året i én markør, kan det være mere effektivt at tælle alle kvartaler og sammenligne dem i en enkelt forespørgsel.