Die Verkettung der Sammlungen in PLSQL
Ich muss zu sammeln eine Menge von ids von ein paar verschiedenen Tabellen in einer Variablen irgendwie übergeben werden, um eine weitere Funktion. Die Tabellen nehmen die ids aus, ist dynamisch, je nach der param-iVar unten. Die Frage ist, wenn es keinen besseren Weg, dies zu tun, da dieser Ansatz zu kopieren und neu zuordnen des arrays mehrmals. Wäre es besser, legen Sie Sie alle in eine temp-Tabelle? Es wäre besser, verwenden dynamisches sql. Finden Sie die get_ids Funktion unten:
FUNCTION concat (
iList1 IN ID_ARRAY,
iList2 IN ID_ARRAY
)
RETURN ID_ARRAY IS
lConcat ID_ARRAY;
BEGIN
SELECT column_value BULK COLLECT INTO lConcat FROM (
(SELECT column_value FROM TABLE(CAST( iList1 AS ID_ARRAY)))
UNION ALL
(SELECT column_value FROM TABLE(CAST( iList2 AS ID_ARRAY)))
);
RETURN lConcat;
END concat;
FUNCTION get_ids (
iVar IN NUMBER
)
RETURN ID_ID_ARRAY IS
lIds ID_ARRAY;
BEGIN
lids := get_ids0();
IF iVar = 1 THEN
lIds := concat(lFilter, get_ids1());
ELSE
lIds := concat(lFilter, get_ids3());
IF iVar = 4 THEN
lIds := concat(lFilter, get_ids4());
END IF;
END IF;
RETURN lIds;
END get_ids;
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du mit 10g oder höher können Sie die CONCAT () - Funktion ein bisschen effizienter mit Hilfe der MULTISET UNION-operator:
Könnten Sie Dinge effizienter durch das Auffüllen der verschiedenen arrays und rufen dann MULTISET UNION einmal für alle:
Verwendung dynamischer SQL - vermutlich ersetzen die verschiedenen
get_idsN()
Funktionen - könnte ein Ansatz sein, eine Untersuchung Wert, aber wahrscheinlich nicht geben Ihnen viel, wenn überhaupt, in der Weise verbesserte Leistung.Temporäre Tabellen sind nicht eine gute Idee, weil Sie auch sehr schlecht im Vergleich zu Dinge in Erinnerung.
Es stellt sich heraus, es ist eine viel einfachere Weise zu verketten:
(Kredit https://forums.oracle.com/forums/thread.jspa?messageID=7420028. Ich hatte keine Ahnung, möglich war dies, bis heute.)