SQL / DB2 - Wert abrufen und aktualisieren/Inkrement gleichzeitig
Ich bin die Verbindung zu einer DB2-Datenbank und ausführen von SQL-Anweisungen.
Ein Beispiel von, was getan wird:
select field from library/file
[program code line finishes executing]
[increment value by one]
update library/file set field = 'incremented value'
Habe ich eine brauchen, um sofort aktualisieren Sie den Wert während der Rückkehr den Wert. Anstatt zu warten, bis das Skript abgeschlossen ist, und führen Sie dann einen separaten UPDATE-Anweisung.
Das Konzept, was ich gerne tun würde, ist dieses:
select field from library/file; update library/file set field = (Current Value + 1); go;
Bitte beachten Sie... das ist nicht die gängige SQL-Datenbank, die die meisten wohl kennen, es ist eine DB2-Datenbank auf einer IBM i.
Dank!
- Klarstellung: DB2 ist eine SQL-Datenbank. Es ist einfach eine andere Implementierung von SQL als die, die Sie gewohnt sind.
- Dank Dan, ich habe klargestellt, dass es sich nicht um einen "normalen" sql-Datenbank":)
- Sie sind mit dem Wert des Feldes in Ihrem Programm? Wenn ja, können Sie besser dran, unter Verwendung einer gespeicherten Prozedur (mit Isolationsstufe für die Transaktion) für diese. Wenn nicht, einfach eine regelmäßige
UPDATE
- Anweisung. Auch gehe ich davon aus, dass Sie irgendwie sorgt für eine einzigartige Zeile ausgewählt/aktualisiert, oder es könnte interessant sein fallout. Warum sind Sie Inkrementieren den Wert auf diese Weise, obwohl? Was bist du eigentlich? - Ja, ich benutze den zurückgegebenen Wert in meinem Programm, erhöhen diese Zahl um 1, und aktualisieren Sie die Aufzeichnung mit dem inkrementierten Wert. Es gibt nur 1 Spalte und 1 Zeile in dieser Tabelle. Es ist einziger Zweck ist, um eine "nächste Zahl" Art der Funktion für eine einzelne Anwendung. Dass ein SP erstellt eine alternative, würde aber erfordern eine DB2 / RPG-Entwickler sind, würde ich eher finden, eine isolierte Lösung, die ich umsetzen konnte mich.
- ... Wirklich, das ist eine schreckliche Idee. Sie sollten mit so genannten SEQUENZ, die im Grunde macht dies automatisch. Vor allem, weil, wenn Sie eine concurrent-Umgebung, müssen Sie sperren, um den Zugriff auf die Tabelle (oder Sie bekommen Sie doppelte Werte) - dies bedeutet, dass beim einfügen mit diesem Wert wäre, serial, sodass einige den Vorteil einer gleichzeitigen Umgebung. Wenn Sie in der Lage sind, um eine Tabelle zu erstellen, ohne ein DBA... sollten Sie zumindest laufen Ihre Idee, an Ihnen vorbei.
- Schön, dass scheint, wie es wäre eine Lösung für mein problem. Wenn Sie einen Beitrag, der als Antwort mit einigen Details, die ich ' ll markieren Sie diese als erledigt.
- DB2 - ist eine normale SQL-Datenbank.
- Gespeicherte Prozeduren können in SQL geschrieben, so ein RPG-Programmierer ist nicht unbedingt erforderlich. Aber es ist immer gut zu prüfen, mit Ihrem DBA. (Ich sage dies als einer 😉
- Siehe auch diese Frage: Ist es möglich das generieren eines eindeutigen numerischen Wertes für jede Zeile in einem iSeries-Tabelle ohne Schleife?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese behandelt das problem von einer anderen app die Aktualisierung der Anzahl zwischen der Zeit, die Sie abrufen und die Zeit, die Sie aktualisieren. Aktualisieren Sie es und verwenden Sie es dann. Wenn zwei Anwendungen versuchen, gleichzeitig wird man warten.
Einem SEQUENCE-Objekt ist entworfen für genau diesen Zweck, aber wenn Sie gezwungen sind, zu halten dieses "next-ID" Datei aktualisiert, das ist, wie ich es tun würde. Folgen Sie dem link in dem Kommentar von @Uhrwerk-Muse für die info auf das SEQUENZ-Objekt, oder versuchen dieses Beispiel von V5R4.
Verwenden Sie ein DB2 - SEQUENZ verwalten Sie die nächste verfügbare Nummer, wenn diese Datei ist lediglich für eine einzelne Zeile speichern Sie Ihre Zähler. Das ist es, was eine SEQUENZ ist entworfen, um zu tun.
Um es einzurichten, verwenden Sie eine CREATE SEQUENCE - Anweisung.
Erhöht den Wert und abzurufen, verwenden Sie ein SEQUENZ-Referenz Ausdruck der form
NEXT VALUE FOR sequence-name
. Um herauszufinden, was der neueste Wert war, verwenden Sie diePREVIOUS VALUE FOR sequence-name
. Diese Ausdrücke können verwendet werden, wie eine regelmäßige jede Spalte Ausdruck, wie in einer SELECT-oder INSERT-Anweisung.Angenommen, Sie möchten zum Beispiel tun Sie dies für Rechnung zahlen (und vielleicht Ihre Buchhaltung nicht wollen, dass Ihre erste Rechnung Nummer 000001, also initialisieren wir Sie höher).
Konnte man eine Nummer für eine neue Rechnung wie diese:
Aber was ist das SYSIBM/SYSDUMMY1 Tabelle? Wir sind nicht wirklich immer alles vom Tisch, also warum sollen wir vorgeben, dies zu tun? Die SELECT-braucht eine AUS-table-Klausel. Aber da wir es nicht benötigen, lassen Sie uns einen WERTE IN - Anweisung.
Damit hat, inkrementiert der Zähler, und setzen Sie den Wert in unsere variable. Könnten Sie diesen Wert verwenden, um einen INSERT in unserer InvoiceHeaders und InvoiceDetails Tabellen.
Oder, Sie könnten erhöhen den Zähler als Sie schreiben ein InvoiceHeader, dann ist es wieder verwenden, wenn das schreiben der InvoiceDetails.
Den VORHERIGEN WERT lokal auf die Besondere Aufgabe zu, so sollte es kein Risiko von einem anderen job bekommen die gleiche Nummer.
Seine Anfrage ist wie folgt:
Updates und ruft bei der gleichen Zeit.
Dies ist möglich, MSSQL, In der Tat ich benutze es eine Menge gibt,
aber DB2 scheint nicht über diese Funktion verfügen.