1Danke
ERLEDIGT
JA
JA
ANTWORTEN
6
6
ZUGRIFFE
357
357
EMPFEHLEN
-
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
-
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.
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?
MarkusGeändert von lmarkus31 (20.05.07 um 09:54 Uhr)
-
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ß*
TimoGeändert von TimoTH (20.05.07 um 11:10 Uhr)
-
Hallo Timo,
Du sagtest ja selbst, dass die Datenstruktur nur ausserhalb deiner Datenbank bekannt ist und dementsprechend kein einzelnes SQL-Statement die Arbeit übernehmen kann.Hatte ja eigentlich auf einen (etwas komplexeren) SQL-Ausdruck gehofft.
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.)Die Stored Procedure wäre somit doch ein wenig ressourcenschonender?!
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
Ähnliche Themen
-
Update mehrerer Datensätze gleichzeitig
Von jack007 im Forum PHPAntworten: 1Letzter Beitrag: 13.08.08, 19:35 -
Anzeigen aller Datensätze aus zwei Tabellen
Von eatpixel im Forum PHPAntworten: 6Letzter Beitrag: 19.08.07, 23:06 -
Freischaltfunktion/Update mehrerer Datensätze
Von baeckerjunge im Forum PHPAntworten: 1Letzter Beitrag: 19.02.07, 09:38 -
UPDATE überschreibt alle Datensätze
Von Budda im Forum PHPAntworten: 4Letzter Beitrag: 01.07.04, 16:34 -
update datensätze fehler
Von Shooter2k im Forum Relationale DatenbanksystemeAntworten: 3Letzter Beitrag: 17.10.03, 16:56





Zitieren
Login





