tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
732
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    sceppi sceppi ist offline Mitglied Bronze
    Registriert seit
    Aug 2007
    Beiträge
    36
    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
     

  2. #2
    Avatar von Exceptionfault
    Exceptionfault Exceptionfault ist offline Mitglied Brokat
    Registriert seit
    Sep 2004
    Ort
    Neckarsulm
    Beiträge
    348
    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!)
     
    liebe Grüße
    Exceptionfault (http://exceptionfault.de)

    Never say: "Always"! Always say: "Never say never"! - Tom Kyte @ Ask Tom Live in Berlin 2008

  3. #3
    sceppi sceppi ist offline Mitglied Bronze
    Registriert seit
    Aug 2007
    Beiträge
    36
    Hallo Exceptionfault,
    wiedereinmal danke für deine Hilfe.
    Ich hab das ganze in einer Schleife gelöst.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
      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...
     

  4. #4
    Avatar von Exceptionfault
    Exceptionfault Exceptionfault ist offline Mitglied Brokat
    Registriert seit
    Sep 2004
    Ort
    Neckarsulm
    Beiträge
    348
    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...
     
    liebe Grüße
    Exceptionfault (http://exceptionfault.de)

    Never say: "Always"! Always say: "Never say never"! - Tom Kyte @ Ask Tom Live in Berlin 2008

  5. #5
    sceppi sceppi ist offline Mitglied Bronze
    Registriert seit
    Aug 2007
    Beiträge
    36
    Zitat Zitat von Exceptionfault Beitrag anzeigen
    Ich schau mal ob ichs bis heute Abend schaffe dein Beispiel mit Temporärer Tabelle aufzubauen...
    Das wäre echt prima, da ich mich mit dem Thema noch nicht auseinander gesetzt habe.
    Danke für die Erläuterungen und die Hilfe.
     

Ähnliche Themen

  1. Applescript: Vorhandensein einer Datei prüfen
    Von einfach nur crack im Forum Coders Talk
    Antworten: 1
    Letzter Beitrag: 14.09.09, 15:46
  2. Objekt auf Existenz prüfen
    Von A319 im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 17.06.08, 00:13
  3. VARRAY als Parameter bei SP aufruf ORACLE
    Von cullmann im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 21.02.07, 19:35
  4. Klassen-Attribute auf vorhandensein Prüfen
    Von mojitoweb im Forum PHP
    Antworten: 2
    Letzter Beitrag: 29.11.05, 14:12
  5. Prüfen auf vorhandensein eines Cookies
    Von piti66 im Forum PHP
    Antworten: 17
    Letzter Beitrag: 02.08.05, 20:15