Tampaknya menjadi varian yang bagus jika ada indeks setidaknya pada effective_start_date
dan effective_end_date
bidang per_all_people_f
tabel.
Varian ideal untuk kueri ini adalah
create index x_per_all_people_search on per_all_people_f(
effective_start_date,
effective_end_date,
person_id,
emp_flag
)
tetapi perawatannya mungkin terlalu mahal (biaya disk, kecepatan penyisipan).
Juga, kursor dalam isi paket harus berisi hasil panggilan fungsi subquery dan penggunaan kembali:
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
);
Tentu saja solusi terbaik adalah meminimalkan sakelar konteks dan mendapatkan semua nilai dari satu kueri SQL. Selain itu, Anda dapat memberikan parameter langsung ke kursor:
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
);
Dari sudut pandang saya, parameter fungsi/kursor terlalu umum, mungkin lebih baik untuk membuat pembungkus yang menggunakan parameter masukan angka seperempat dan dua tahun untuk dibandingkan.
Dan terakhir, jika hasil yang direncanakan untuk digunakan dalam PL/SQL (saya kira karena mengembalikan satu baris) jangan gunakan kursor sama sekali, cukup kembalikan nilai yang dihitung melalui parameter output. Dari sudut pandang lain, jika Anda perlu mendapatkan data kuartal selama setahun penuh dalam satu kursor, mungkin lebih efisien untuk menghitung semua kuartal dan membandingkannya dalam satu kueri.