PDA

View Full Version : nach Insert neu gen. Datensatz ermitteln



M.Kasper
11-08-06, 11:02
Nach einem Insert innerhalb einer Stored Procedure möchte ich den neu generierten Datensatz weiterverarbeiten. Kann mir jemand sagen, wie man diesen neu generierten Datensatz ermitteln und wieder darauf zugreifen kann ? (Zugriff soll innerhalb der selben Stored Procedure mit dem Insert erfolgen - der Zugriff via eindeutigem Key ist leider nicht möglich, da dieser extern von einem Trigger erzeugt wird.)
Thanks in Advance
Matthias

Fuerchau
11-08-06, 11:22
Ausser dem Key hast du doch noch alle Felder in der Prozedur. Warum kannst du die Verarbeitung nicht vor dem Insert ausführen ?

M.Kasper
11-08-06, 11:43
da ich für die weitere Verarbeitung den neuen Datensatz bzw. am besten gleich den Key des neuen Datensatzes benötige. Wollte mit dem Insert ein neues Produkt anlegen - Trigger vergibt die neue Produktnummer - und genau diese neue Produktnummer wird für die weitere Verarbeitung benötigt.

Fuerchau
11-08-06, 11:49
Tja, schlechtes Design, würde ich sagen.
Die Vergabe der neuen Produktnummer sollte dann am besten in eine Funktion verlegt werden, die sowohl vom Trigger als auch von deiner Prozedur aufrufbar ist.
Ansonsten sehe ich da wirklich schwarz.

M.Kasper
24-08-06, 16:16
Nur wie könnte man dann sicherstellen, dass der Aufruf dieser Funktion (Ermittlung der max. Produktnummer +1) aus der Stored Procedure das selbe Ergebniss liefert, wie aus dem zugehörigen Trigger (die Aufrufe erfolgen zeitlich versetzt und in der Zwischenzeit könnte ja ein andere Job die selbe Funktion aufrufen).

B.Hauser
24-08-06, 16:51
Nur wie könnte man dann sicherstellen, dass der Aufruf dieser Funktion (Ermittlung der max. Produktnummer +1) aus der Stored Procedure das selbe Ergebniss liefert, wie aus dem zugehörigen Trigger (die Aufrufe erfolgen zeitlich versetzt und in der Zwischenzeit könnte ja ein andere Job die selbe Funktion aufrufen).

Eigentlich macht man so etwas über Identity Columns, die in den physischen Tabellen definiert werden und nicht über Trigger. Die Verwendung von Identity Columns ist auf alle Fälle performanter als Trigger, da bei einem Trigger immer ein dynamischer Programmaufruf initiiert wird, während bei der Identity Column der Datenbankenmanager den nächsten Wert direkt aus einer Datenstruktur ausliest, diese aktualisiert und auch gleich Folgewerte bereitstellt. Der nächste Wert wird immer ermittelt, unabhängig, wie der Datensatz erstellt wurde, also auch bei native I/O (z.B. über OpCode WRITE in RPG)

Der aktuelle Wert des zuletzt eingefügten Satzes kann über die skalare Funktion IDENTITY_VAL_LOCAL ermittelt werden.
Bei dieser Funktion wird der letzte in dem aktuellen Job vergebene Wert der Identity Spalte zurückgeliefert, auch dann wenn zwischenzeitlich durch andere Jobs weitere Sätze geschrieben wurden.

Um diese Funktionalitäten benutzen zu können, müsstest Du allerdings die Datei/Tabelle über CREATE TABLE neu erstellen. Über der Identity Column MUSS auf alle Fälle ein Unique Index (oder auch DDS-beschriebene logische Datei mit Schlüssel-Wort UNIQUE) angelegt werden. Sollte der eindeutige Zugriffsweg fehlen, kann nicht sichergestellt werden, dass bei Änderung des Start-Wertes oder bei einem Überlauf keine Duplikate erstellt werden.

Birgitta

M.Kasper
25-08-06, 07:32
Thanks a lot, für die 100%'tig passende Lösung. Habe es auch schon verifiziert und es funktioniert super.
Ich war nur etwas verwundert, da in den Red Books bei dieser Lösung immer die Anmerkung zu finden war, dass dies in Verbindung mit einem involvierten Trigger nicht funktionieren würde !! (würden einen neuen Level initiieren ..). Nochmals vielen Dank - CU Mk