Verkar vara en bra variant om det finns index på åtminstone effective_start_date
och effective_end_date
fält av per_all_people_f
bord.
Idealisk variant för denna fråga är
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 vara för dyrt att underhålla (diskkostnad, insättningshastighet).
Dessutom måste markören i paketets kropp innehålla underfråga och återanvända funktionsanropsresultat:
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
);
Naturligtvis är bästa lösningen att minimera kontextväxlingar och få alla värden från en enda SQL-fråga. Du kan också ange parametrar direkt till 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
);
Ur min synvinkel är funktion/markörparametrar för generiska, kan vara bättre att skapa ett omslag som tar som indataparametrar kvartalsnummer och två år att jämföra.
Och sist, om resultaten planerade att användas i PL/SQL (jag antar att på grund av att en enda rad returneras) inte använder markören alls, returnera bara beräknade värden genom utdataparametrar. Ur en annan synvinkel kan det vara mer effektivt att räkna alla kvartal och jämföra dem i en enda fråga om du behöver få kvartalsdata för hela året med en markör.