Zdá se, že je to dobrá varianta v případě, že existuje index alespoň effective_start_date
a effective_end_date
pole per_all_people_f
tabulka.
Ideální varianta pro tento dotaz je
create index x_per_all_people_search on per_all_people_f(
effective_start_date,
effective_end_date,
person_id,
emp_flag
)
ale může být příliš nákladná na údržbu (cena disku, rychlost vkládání).
Kurzor v těle balíčku také musí obsahovat výsledky poddotazu a opětovného použití funkce:
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
);
Nejlepším řešením je samozřejmě minimalizovat přepínání kontextu a získat všechny hodnoty z jediného SQL dotazu. Také můžete zadat parametry přímo kurzoru:
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
);
Z mého pohledu jsou parametry funkce/kurzoru příliš obecné, může být lepší vytvořit obal, který jako vstupní parametry vezme čtvrtletní číslo a dva roky pro srovnání.
A konečně, pokud výsledky plánované pro použití v PL/SQL (předpokládám, že kvůli vrácení jednoho řádku) vůbec nepoužívají kurzor, pouze vracejí vypočítané hodnoty prostřednictvím výstupních parametrů. Z jiného úhlu pohledu, pokud potřebujete získat údaje za čtvrtletí za celý rok jedním kurzorem, může být efektivnější spočítat všechna čtvrtletí a porovnat je v jediném dotazu.