Hallo,

solltest Du noch nicht auf Release V5R3M0 sein, könntest Du einen Before Insert Trigger generieren. In diesem Trigger wird die letzte (höchste) laufende Nr. ermittelt und hochgezählt. Anstatt die letzte laufende Nr. direkt aus der Datei zu ermitteln, würde ich sie in einer Data Area speichern und jeweils aktualisieren. Eine Data Area hat zum einen den Vorteil, dass bei paralellen Inserts immer der letzte Wert ermittelt und fortgeschrieben wird. Zum anderen ist kein Datei-Zugriff erforderlich ist. Bei einem Dateizugriff wäre zu beachten, dass bei paralellen Anfragen oder je nach dem verwendeten Commitment Level nicht auf den letzten Wert zugegriffen werden kann und somit doppelte Werte ermittelt werden könnten.

Ab Release V5R3M0 hast Du die Möglichkeit ein Sequence Objekt (CREATE SEQUENCE) zu erstellen, bei dem Start und Endwert, sowie Schrittgröße angegeben werden können. Bei einem Sequence Objekt handelt es sich ebenfalls um eine Datenstruktur, in der die letzten Werte gespeichert werden. Um die nächste Sequence-Nr. zu ermitteln und in die Datei zufüllen ist kein Trigger erforderlich, sondern kann in Insert-Statement über NEXT VALUE FOR SequenceObject direkt angegeben werden.

Eine weitere Möglichkeit, sofern Du die Datei, in die die Sätze eingefügt werden ändern darfst, wäre eine Identity Column zu verwenden. Dies setzt allerdings voraus, dass die Datei/Tabelle mit SQL und nicht mit DDS erstellt wird. Identity columns müssen grundsätzlich numerisch sein (gepackt, gezont, Integer oder Float). Es kann ein Start- und Endwert, sowie eine Schrittgröße angegeben werden. Ausserdem kann angegeben werden, wie auf einen Überlauf reagiert werden soll. Eine Identity Column garantiert noch keinen Unique Key, d.h. es muss zusätzlich eine logische Datei oder ein SQL-Index mit Unique Key über diese Spalte gelegt werden. Beim Einfügen in eine solche Datei wird der Wert für diese Spalte automatisch ermittelt und in den Datensatz geschrieben. Es ist keine zusätzliche Aktion notwendig.

PHP-Code:
CREATE TABLE MySchema/MyTable (
   
MyFld1 DECIMAL(90)
         
GENERATED ALWAYS AS IDENTITY (
         
START WITH 10 INCREMENT BY 10
         NO MINVALUE NO MAXVALUE
         CYCLE ORDER
         CACHE 20 
),
   
MyFld2 ....