Ich schreibe gerade PL/SQL und bin in ein sich wiederholendes Muster verfallen:
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();
Wenn ich dann die Ergebnisse verarbeite, habe ich einen Code wie diesen:
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;
Der Code in der Verarbeitungsschleife ist für alle Cursors gleich, da alle 3 Cursors Folgendes zurückgeben a,b,c
- der einzige Unterschied besteht darin, welcher Cursor referenziert wird. Ich wollte dies in eine Art von generischen Ergebnismenge Prozessor umgestalten, aber ich bin hier stecken:
procedure sp_process_collection(in_collection t_curs1_tab) is ...
Ich kann dies nur mit v_curs1_results
kann ich es nicht nennen mit v_curs2_results
oder ich bekomme eine PLS-00306 wrong number of types or arguments...
Compiler-Fehler. Gibt es eine Möglichkeit, dies generisch zu tun, so dass ich nur eine Auflistungsbearbeitungsprozedur schreiben muss? Ich habe dieses Muster von Cursor (Rückgabe der gleichen drei Spalten, immer die gleichen Typen) erscheint in mehreren anderen Teilen des gleichen Pakets, und die Verarbeitung Schleife, während semantisch die gleiche ist manchmal mit leicht unterschiedlichen Code geschrieben. Ich würde die Verarbeitung gerne in einer einzigen Prozedur zentralisieren, ich weiß nur nicht, wie ich das in PL/SQL machen soll. Ich weiß, dass PL/SQL keine Generics hat (was ich piense en hätte eine Java/C#-Lösung ziemlich trivial gemacht), aber ich frage mich, ob es eine andere Möglichkeit gibt, dieses Problem anzugehen, an die ich einfach nicht gedacht habe.
(unter Verwendung von Oracle 10g)