Я пишу какой-нибудь PL / SQL и обнаружил, что попадаю в повторяющийся шаблон:
cursor c_curs1 is
select a, b, c
from (...) big_subquery_1
where big_subquery_1.a_ind = 'Y'
cursor c_curs2 is
select a, b, c
from (...) big_subquery_2
where big_subquery_2.b_ind = 'R'
cursor c_curs3 is
select a, b, c
from (...) big_subquery_3
where big_subquery_3.c_ind = 'M'
...
type t_curs1_tab is table of c_curs1;
type t_curs2_tab is table of c_curs2;
type t_curs3_tab is table of c_curs3;
...
v_curs1_results t_curs1_tab := t_curs1_tab();
v_curs2_results t_curs2_tab := t_curs2_tab();
v_curs3_results t_curs3_tab := t_curs3_tab();
Затем, при обработке результатов, у меня есть такой код:
open c_curs1;
fetch c_curs1 bulk collect into v_curs1_results;
close c_curs1;
if v_curs1_results.first is not null and v_curs1_results.last is not null then
for i in v_curs1_results.first .. v_curs1_results.last loop
/*Do something with field a in the results
Do something with field b in the results
Do something with field c in the results*/
....
end loop;
end if;
код в цикле обработки одинаков для всех курсоров, так как все 3 курсора возвращают a,b,c
- единственное отличие состоит в том, на какой курсор ссылается.Я хотел преобразовать это в какой-то типовой процессор набора результатов, но я застрял здесь:
procedure sp_process_collection(in_collection t_curs1_tab) is ...
Я могу вызвать это только с помощью v_curs1_results
, я не могу вызвать это с помощью v_curs2_results
или я получаю PLS-00306 wrong number of types or arguments...
ошибку компилятора.Есть ли способ сделать это в общем, поэтому мне нужно написать только одну процедуру обработки коллекции?У меня такой шаблон курсора (возвращающий те же три столбца, всегда одинаковые типы) появляется в нескольких других частях одного и того же пакета и в цикле обработки, хотя семантически то же самое иногда пишется с немного другим кодом.Мне бы очень хотелось централизовать обработку в одной процедуре, я просто смог бы выяснить, как это сделать в PL / SQL.Я знаю, что PL / SQL не имеет обобщений (которые, как я думаю сделали бы решение Java / C # достаточно тривиальным), но мне интересно, есть ли другой способ решения этой проблемы, которого у меня просто нет?t думал о.
(используя Oracle 10g)