Update aller Datensätze

TimoTH

Mitglied
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:
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
 
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
 
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
 
Moin,

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

Zum Einen wären da Bulk-Statements so z.B.
SQL:
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:

SQL:
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
 
Zuletzt bearbeitet:
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
 
Zuletzt bearbeitet:
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
 
gut, dann werde ich das mal über eine Stored Procedure probieren..
Ich danke dir für deine Hilfe!

*gruß*
Timo
 

Neue Beiträge

Zurück