Sembra essere una buona variante nel caso in cui ci siano indici almeno su effective_start_date
e effective_end_date
campi di per_all_people_f
tabella.
La variante ideale per questa query è
create index x_per_all_people_search on per_all_people_f(
effective_start_date,
effective_end_date,
person_id,
emp_flag
)
ma potrebbe essere troppo costoso da mantenere (costo del disco, velocità di inserimento).
Inoltre, il cursore nel corpo del pacchetto deve contenere sottoquery e riutilizzare i risultati delle chiamate di funzione:
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
);
Ovviamente la soluzione migliore è ridurre al minimo i cambi di contesto e ottenere tutti i valori da una singola query SQL. Inoltre, puoi fornire parametri direttamente al cursore:
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
);
Dal mio punto di vista i parametri della funzione/cursore sono troppo generici, potrebbe essere meglio creare un wrapper che richieda come parametri di input un quarto e due anni per essere confrontati.
E infine, se i risultati pianificati per essere utilizzati in PL/SQL (suppongo che a causa della restituzione di una singola riga) non utilizzino affatto il cursore, restituiscono semplicemente i valori calcolati tramite i parametri di output. Da un altro punto di vista, se è necessario ottenere i dati trimestrali per l'intero anno in un cursore, potrebbe essere più efficiente contare tutti i trimestri e confrontarli in un'unica query.