tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von lmarkus31
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
357
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    TimoTH TimoTH ist offline Mitglied Silber
    Registriert seit
    Jul 2006
    Beiträge
    51
    Hallöle!
    Ich möchte gerne alle Datensätze in einer Tabelle updaten.
    Allerdings soll jedem Datensatz ein bestimmer Wert zugewiesen werden.
    wobei diese Werte einer Datenstruktur gespeichert sind.
    In einer for-Schleife ausgedrückt, sähe das ungefähr so aus:
    Code :
    1
    2
    3
    
    for(int i=0; i < datalength; i++){
        update tabelle set koordinate = datastruktur.getKoordinate(i) where id = datastruktur.getID(i);
    }

    Ist es möglich, diese vielen einzelnen Abfragen zu einer einzigen zusammenzubasteln?
    Habe zwar fleissig gegoogelt, aber nichts wirklich hilfreiches gefunden.

    *gruß*
    Timo
     

  2. #2
    lmarkus31 lmarkus31 ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Beiträge
    318
    Hallo Timo,

    wenn die "Datenstruktur" nur in der Umgebung bekannt ist, aus der du das Tabellen-Update ausführst, dann bleibt Dir nichts anderes übrig, als es so oder so ähnlich zu realisieren, wie du es beschrieben hast.

    Sofern du bei deiner Datenbank die Möglichkeit hast, prozeduralen Code auszuführen, also nicht "einfaches SQL", dann kannst du darüber nachdenken, deine Updates in eben solch einer Stored Procedure abzubilden. Dann hast du u.U. die Möglichkeit, deine Datenstruktur in der Prozedur selbst zu füllen und Array-Funktionen zu nutzen.

    Klingt ziemlich theoretisch, aber mehr lässt sich ohne weiteres nicht aus deinem Post herauslesen. Welche Datenbank und welche Version verwendest Du? Woher kommt denn die "Datenstruktur" von der du sprichst?

    Markus
     

  3. #3
    TimoTH TimoTH ist offline Mitglied Silber
    Registriert seit
    Jul 2006
    Beiträge
    51
    Morgsche!
    Wir haben hier eine Oracle 9 Datenbank und haben auch über PL/SQL die Möglichkeit Stored Procedures auszuführen.

    Die Datenstruktur selbst wird und muss aus verschiedenen Gründen im Programm erzeugt werden. U.a. werden da die Datenbankdaten, welche ich später für meinen Update brauche, abgelegt, aber auch programmspezifische Daten.

    Wenn das geht, eine Datenstruktur (was für ein Typ genau das sein muss, da wäre ich flexibel) an die Datenbank zu geben, und über eine Stored Procedure den Update auszuführen, wäre natürlich auch Klasse.
    Ich denke mal , die Prozedur selbst würde ich hinbekommen. Wo ich nun ein Problem hätte, wie überhaupt eine Datenstruktur an die Datenbank übergeben?

    *gruß*
    Timo
     

  4. #4
    lmarkus31 lmarkus31 ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Beiträge
    318
    Moin,

    ohne jetzt auf weitere Details einzugehen, kann ich Dir folgende Anregungen geben:

    Zum Einen wären da Bulk-Statements so z.B.
    Code sql:
    1
    2
    
    FORALL i IN ids.FIRST..ids.LAST
     UPDATE tabelle SET koordinate = koordinaten(i) WHERE id =ids(i);

    wobei "ids" und "koordinaten" dann deine Collections sind. (NESTED TABLE etc.) und Teile deiner "datastruktur" sind.

    Die schemabekannte NESTED TABLE kannst du z.B. so definieren:

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    
    CREATE TYPE datastruktur_typ AS OBJECT (
       id NUMBER(10),
       koordinate ... ,
       ...
    );
     
    CREATE TYPE datastruktur_table_typ AS TABLE OF datastruktur_typ;

    Und diesen schemaweiten Tabellentyp könntest du bspw. in OCI verwenden und dann deine Datenstruktur füllen und an eine Stored Procedure übergeben oder einen anonymen PL/SQL Codeblock ausführen, der auch Bulk-Funktionen nutzt.

    Die Frage ist, ob sich der Aufwand lohnt gegenüber der Lösung mit einzelnen UPDATE-Statements. Soll das Statement öfter ausgeführt werden? Wieviele Datensätze werden upgedatet? 100? 1000? 1000000?

    Markus
    Geändert von lmarkus31 (20.05.07 um 09:54 Uhr)
     

  5. #5
    TimoTH TimoTH ist offline Mitglied Silber
    Registriert seit
    Jul 2006
    Beiträge
    51
    Hallöle!
    Die Anzahl der zu aktualisierenden Datensätze liegt so bei max 500, nicht mehr.

    Wie oft diese Aktualisierung aufgerufen wird, hängt vom Nutzer des Programms ab. Ich denke allerdings, das sich dies durchaus in vernünftigen Grenzen halten wird...

    Hatte ja eigentlich auf einen (etwas komplexeren) SQL-Ausdruck gehofft. Aber wenn es wohl nur über eine Stored Procedure zu realisieren ist, erscheint mir der Aufwand doch etwas zu hoch, oder!?

    Allerdings muss ich noch dazu sagen, das sich die Datenbank nicht im selben lokalen Netz befinden muss, wie das Programm ,welches das Update startet. Da liegt möglicherweise eine recht langsame Internetverbindung dazwischen. Die Stored Procedure wäre somit doch ein wenig ressourcenschonender?!


    *gruß*
    Timo
    Geändert von TimoTH (20.05.07 um 11:10 Uhr)
     

  6. #6
    lmarkus31 lmarkus31 ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Beiträge
    318
    Hallo Timo,

    Hatte ja eigentlich auf einen (etwas komplexeren) SQL-Ausdruck gehofft.
    Du sagtest ja selbst, dass die Datenstruktur nur ausserhalb deiner Datenbank bekannt ist und dementsprechend kein einzelnes SQL-Statement die Arbeit übernehmen kann.

    Die Stored Procedure wäre somit doch ein wenig ressourcenschonender?!
    Ja, das wäre sie. Wie weiter oben angedeutet, kannst du ja innerhalb der Stored Procedure bspw. mit BULK-Updates viele Updates an den SQL-Interpreter weiter reichen und das mit nur einem PL/SQL-Statement und ein bisschen Zusatzarbeit (Collections initialisieren usw.)
    Jetzt hängt es natürlich auch noch davon ab, wie gross die zu übergebende Datenstruktur ist., also wieviel Einträge sie enthält.

    Markus
    TimoTH bedankt sich. 

  7. #7
    TimoTH TimoTH ist offline Mitglied Silber
    Registriert seit
    Jul 2006
    Beiträge
    51
    gut, dann werde ich das mal über eine Stored Procedure probieren..
    Ich danke dir für deine Hilfe!

    *gruß*
    Timo
     

Ähnliche Themen

  1. Update mehrerer Datensätze gleichzeitig
    Von jack007 im Forum PHP
    Antworten: 1
    Letzter Beitrag: 13.08.08, 19:35
  2. Antworten: 6
    Letzter Beitrag: 19.08.07, 23:06
  3. Freischaltfunktion/Update mehrerer Datensätze
    Von baeckerjunge im Forum PHP
    Antworten: 1
    Letzter Beitrag: 19.02.07, 09:38
  4. UPDATE überschreibt alle Datensätze
    Von Budda im Forum PHP
    Antworten: 4
    Letzter Beitrag: 01.07.04, 16:34
  5. update datensätze fehler
    Von Shooter2k im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 17.10.03, 16:56