hm. Bin hier ohne meine recht umfangreiche DB2 Doku. Keine Gewähr für Korrektheit.
Sehe grundsätzlich 2 Möglichkeiten:
1. Du schreibst vor dem Insert ein Select der Art (so ähnlich)
Select Nummer From Kunden order by Desc Nummer
Der erste Datensatz ist dann der mit der höchsten Nummer. Es gibt da auch ein FETCH Schlüsselwort, wo man sich nicht das gesamte Resultset zieht, wenn man nur das erste Tupel braucht.
Problem ist, dass zwischen Select und Insert jemand anders in die Tabelle geschrieben haben kann.
Du kannst dich davor schützen, indem du das Transaktions-Isolations Level der Connection auf Serializable setzt. Das ist aber nicht so gut oder besser gesagt sehr schlecht für die Performance.
DB2 hat aber seit ca. Version 7 ein Feature, dass Nummern automatisch hochzählt.
In DDL sieht das ungefähr so aus (für die Spalte):
Nummer BigInt as Identity (+kryptische Starts with increment by cache Syntax),
Diese column dann im insert nie berücksichtigen.
Also in Tabelle Kunde mit Spalten Nummer und Name:
Insert Into Kunde (Name) Values ("der Name");
Die Nummer wird automatisch gesetzt.
Für dein anderes Problem: Bekommst du irgendwelche DB2 - Fehlermeldungen zurück. Wenn man die entsprechende Dokumentation hat, kann man mit den 5-stelligen error-codes ganz gut arbeiten.
Axel
DDL-Beispiel einer Relation mit Identity-Spalte :
CREATE TABLE USERNAME (
ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE ),
nameUSER VARCHAR(20),
pwd VARCHAR(20),
email VARCHAR(30),
MONEY DECIMAL(10,2),
PositionUSER BigInt
);
ALTER TABLE USERNAME ADD CONSTRAINT "PKEY_USER" PRIMARY KEY ("ID");
CREATE UNIQUE INDEX "index_User_Name" ON USERNAME (nameUSER);
Zugriffbeispiel (ok ist in ibatis sqlmaps, kann aber leicht auf andere RDBMS-Frameworks transferiert werden:
INSERT INTO
UserName (nameUser, pwd, email, money, positionUser) Values
(#nameUser#, #pwd#,#email#, #money#, #position#)
Wichtig ist die Spaltennamen explizit zu benennen. Die Identity column (hier: ID) hier nicht setzen. Das wird automatisch von DB2 erledigt.
Oft braucht man im Skript die von DB2 generierte ID unmittelbar nach dem insert. Falls es neben der ID Spalte einen eindeutigen "natürlichen " key (im Beispiel nameUser) gibt, kann man ein Select versuchen.
Das ist nicht besonders performant.
DB2 kennt ausserdem die proprietäre Funktion Values(identity_val_local()), womit man die zuletzt eingefügte ID bekommt. Noch nicht zu Ende gedacht, aber diese Funktion unterliegt möglicherweise concurrency Problemen (gleichzeitiges einfügen von Datnesätzen). In dem Framework, mit dem ich z.Zt. mit DB2 arbeite (ibatis sqlmaps), scheinen automatisch irgendwelche Transaktionen gesetzt zu werden, die das möglicherweise absichern. Werd mir das nochmal genauer anschauen.
Ein Identity oder autoIncrement sowie eine Funktion, um den letzten Wert zu ermitteln, gibt es in praktischen allen Rdbms (inklusive open source wie mySql und Hypersonic). Nur ist das nicht nicht standardisiert und läuft überall ein bischen anders.
Wenn du eine email an axel dot janssen at gmail dot com schickst, kann ich dir ein paar sinnvolle redbooks schicken (zu db2 vs.7, aber ich arbeite auch mit 8 mit denen).
Z.B. braucht man imho eine Übersicht der errorcodes und -states bei solchen Meldungen:
ause: com.ibm.db2.jcc.b.SqlException: DB2 SQL error: SQLCODE: -803, SQLSTATE: 23505, SQLERRMC: 1;DB2ADMIN.USERNAME