Hier ist ein einfaches und effektives PL/SQL-Beispiel, um eine große Menge von IDs im SELECT IN zu verarbeiten, indem die IDs in Chunks aufgeteilt werden. Der Code verwendet eine temporäre Tabelle oder eine Collection (z. B. PL/SQL-Tabelle) zum Zwischenspeichern der IDs.
Beispiel: PL/SQL mit Chunks
DECLARE
— Große Menge an IDs als Beispiel
IN_IDS SYS.ODCINUMBERLIST := SYS.ODCINUMBERLIST(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
CHUNK_SIZE PLS_INTEGER := 5; — Anzahl der IDs pro Abfrage
CHUNK SYS.ODCINUMBERLIST; — Chunk zum Speichern von Teilmengen
IDX_START PLS_INTEGER := 1; — Startindex für den Chunk
BEGIN
— Schleife durch die gesamte Liste der IDs in Chunks
WHILE IDX_START <= IN_IDS.COUNT LOOP
-- Teilmenge (Chunk) der IDs erstellen
CHUNK := IN_IDS(IDX_START .. LEAST(IDX_START + CHUNK_SIZE - 1, IN_IDS.COUNT));
-- Abfrage mit dem aktuellen Chunk
FOR REC IN (
SELECT EMP_ID, NAME, SALARY
FROM EMPLOYEES
WHERE EMP_ID IN (SELECT COLUMN_VALUE FROM TABLE(CHUNK))
) LOOP
-- Ergebnis verarbeiten (z. B. ausgeben)
DBMS_OUTPUT.PUT_LINE('ID: ' || REC.EMP_ID || ', Name: ' || REC.NAME || ', Salary: ' || REC.SALARY);
END LOOP;
-- Nächster Chunk
IDX_START := IDX_START + CHUNK_SIZE;
END LOOP;
END;
/
Erklärung
1. IN_IDS als Eingangsliste:
• SYS.ODCINUMBERLIST ist eine Oracle vordefinierte Collection, die als Eingabeliste für IDs dient. Diese kann mit beliebig vielen Werten befüllt werden.
2. Chunk-Größe (CHUNK_SIZE):
• Die Liste wird in Blöcke der Größe CHUNK_SIZE aufgeteilt (z. B. 5 IDs pro Abfrage).
3. CHUNK enthält Teilmenge der IDs:
• Die Methode IDXS .. LEAST(...) sorgt dafür, dass der Chunk nicht über die Liste hinausgeht.
4. Abfrage mit SELECT IN:
• TABLE(CHUNK) konvertiert die Collection in eine Tabellenform, sodass sie in der IN-Klausel verwendet werden kann.
5. Ergebnisse verarbeiten:
• Innerhalb der FOR REC IN-Schleife werden die Ergebnisse für jeden Chunk verarbeitet.
6. Nächster Chunk:
• IDX_START wird um die Größe des Chunks erhöht, um die nächste Teilmenge abzuarbeiten.
Vorteile dieses Ansatzes
• Einfach: Kein Bedarf an temporären Tabellen, alles passiert im Speicher.
• Effizient: Die IN-Klausel wird mit einer begrenzten Anzahl an IDs gefüllt, um Performanceprobleme zu vermeiden.
• Flexibel: Funktioniert für beliebig große Listen, da die Abfragen in Blöcken erfolgen.
Beispiel-Ausgabe
Für die Beispiel-Liste IN_IDS mit 15 IDs und einem CHUNK_SIZE von 5:
ID: 1, Name: John, Salary: 5000
ID: 2, Name: Jane, Salary: 6000
...
ID: 15, Name: Alice, Salary: 7000
Möchtest du weitere Details oder Anpassungen?
Neueste Kommentare