Scheint eine gute Variante zu sein, falls der Index mindestens am effective_start_date
vorhanden ist und effective_end_date
Felder von per_all_people_f
Tabelle.
Ideale Variante für diese Abfrage ist
create index x_per_all_people_search on per_all_people_f(
effective_start_date,
effective_end_date,
person_id,
emp_flag
)
aber die Wartung kann zu teuer sein (Festplattenkosten, Einfügungsgeschwindigkeit).
Außerdem muss der Cursor im Paketkörper Unterabfragen enthalten und Ergebnisse von Funktionsaufrufen wiederverwenden:
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
);
Die beste Lösung ist natürlich, Kontextwechsel zu minimieren und alle Werte aus einer einzigen SQL-Abfrage zu erhalten. Außerdem können Sie Parameter direkt an den Cursor übergeben:
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
);
Aus meiner Sicht sind Funktions-/Cursor-Parameter zu generisch, vielleicht ist es besser, einen Wrapper zu erstellen, der als Eingabeparameter die Quartalszahl und zwei Jahre zum Vergleichen verwendet.
Und zuletzt, wenn Ergebnisse, die für die Verwendung in PL/SQL geplant sind (ich nehme an, dass wegen der Rückgabe einer einzelnen Zeile), den Cursor überhaupt nicht verwenden, geben Sie einfach berechnete Werte über Ausgabeparameter zurück. Aus einem anderen Blickwinkel, wenn Sie Quartalsdaten für das gesamte Jahr in einem Cursor erhalten müssen, kann es effizienter sein, alle Quartale zu zählen und in einer einzigen Abfrage zu vergleichen.