Oracle: Objekt auf vorhandensein in einen varray prüfen

sceppi

Mitglied
Hallo,
ich hab mal wieder eine Frage:
Ich habe verschiedene varchar2 Einträge in einen varray.
Jetzt sollen neue Einträge in dieses varray gemacht werden, allerdings ohne dubletten. Soll heißen: ist der neue Eintrag schon in dem varray vorhanden, soll er nicht eingetragen werden.
Die Methode Exists prüft ja nur, ob ein Element an der Stelle n vorhanden ist, prüft aber nicht den Wert.
Gibt es dafür eine Methode in PL/SQL (Oracle 10g) oder muss ich mir da selber eine Funktion schreiben?
MfG
sceppi
 
PL/SQL kennt dafür keine Methode, d.h. du müsstet dafür schon in einer Schleife durch alle Werte durchlaufen und vergleichen.
Eventuell solltest du stattdessen eher eine temporäre Tabelle in Betracht ziehen und mit einem Unique Key arbeiten und die Eindeutigkeit mit Datenbankmitteln sicherstellen. (Dafür ist sie auch optimiert!)
 
Hallo Exceptionfault,
wiedereinmal danke für deine Hilfe.
Ich hab das ganze in einer Schleife gelöst.

Code:
  FUNCTION checkDouble(aV vArray, sVergleich varchar2)
   Return boolean is
   Result boolean := false;
   i integer;
  BEGIN
  FOR i IN 1 .. aV.COUNT LOOP
   if aV(i) = sVergleich then
    Result := true;
    return Result;
   END IF;
  END LOOP;
  return Result; 
  END checkDouble;

aV ist ein varray mit Strings...
 
Schleifen sind für meinen Geschmack immer schlecht, da die Performance im schlimmsten Fall linear zur Anzahl der Elemente in deinem Array abnimmt. Mit einer temporären Tabelle und einem Unique Key passiert dies nicht, da ein Indexzugriff auf die Tabelle über einen B*Tree Baum wie ihn Oracle benutzt, für alle Elemente den selben Aufwand bedeutet, unabhängig von der Anzahl der Elemente. Der Aufwand bleibt selbst bei Milliarden von Zeilen minimal.

Selbstverständlich kommt es auch ein bisschen drauf an, was du mit den Daten machen willst, und woher sie kommen. Wenn die Daten hinterher in Tabellen landen sollen, und vielleicht sogar noch aus Tabellen kommen, würde ich auf jeden Fall den Weg über Temporäre Tabellen gehen. Somit bleiben die Daten stets in der "SQL" Ebene von Oracle und müssen nicht in die "PL/SQL Ebene" transferiert werden. Mein Ansatz ist immer:

1.) Versuche das Problem mit SQL zu lösen, dafür ist die Datenbank da. Dort ist sie schnell. Es wird keine Prozedur geben, egal ob C, C++ oder PL/SQL das diese Aufgabe schneller erledigen kann.
2.) Versuche das Problem in PL/SQL zu lösen, zumindest solange es ein datentechnisches Problem und kein Berechnungsproblem ist. Für komplizierte Berechnungen ist C oder C++ die erste Wahl. Bei Massendatenverarbeitung geht jedoch nichts über PL/SQL. Kein Stück Software arbeitet näher an den Daten als die PL/SQL Engine von Oracle.
3.) Wenn 1.) und 2.) nicht ausreichen... Die Aufgabe überdenken :-)
4.) .NET oder Java als Stored Procedures in Erwägung ziehen.
5.) Code zur Verarbeitung in den Client, als LETZTE Variante.

Ich schau mal ob ichs bis heute Abend schaffe dein Beispiel mit Temporärer Tabelle aufzubauen...
 
Zurück