# Eingefügter Datensatz erneut abfragen.



## Bjoern2 (26. Jul 2007)

Hallo.

Ich möchte per Insert-Statement einen Datensatz in eine beliebige Datenbank einfügen, brauche aber anschließend den tatsächlichen Datensatz, der eingefügt wurde zur weiteren Verarbeitung im Java-Programm.

Z.B. habe ich folgendes postgres-Statement:

```
INSERT INTO XYZ(ColPK, Col1, Coln) VALUES(nextval('seq_abc'), 'ein text', 123)
```
Problem ist, dass ich gar nicht weiß, was für nextval() raus kommt.

*Bietet Java irgendeine Möglichkeit den zu letzt eingefügten DS abzufragen, was aber auch für alle Datenbanken gültig ist?*

Ich habe mir schon überlegt vor dem Einfügen, ein normales SQL zu stricken, welches die Einfügewerte und Funktionen enthält und das empfangene RecordSet dann anschließend mit INSERT einzufügen.
Also z.B:

```
SELECT nextval('seq_abc'), 'ein text', 123) [...]
```
Problem ist hier allerdings, dass ich hier eine allgemein mögliches SQL brauche, um diese Daten abzufragen.

In postgres reicht ja nur ein einfaches "SELECT" um Werte und Funktionen abzufragen.
DBs wie Oracle und Co. brauchen allerdings immer ein "FROM" im SQL-Statement.
Also müsste ich in Oracle z.B. "SELECT [...] FROM dual" schreiben.
Wie gesagt, brauche ich aber eine allgemeine Lösung, weil ich vorher nicht weiß, auf welche Datenbank zugegriffen wird. :-(

Ich greife übrigens auf jeden Fall auf folgende DBs zu:
- DBISAM (via ODBC)
- postgreSQL

Hat irgendjemand eine zündende Idee?
 :bahnhof:


----------



## bronks (26. Jul 2007)

z.B. wie es in SAP gemacht wird und mit EJB nicht anders möglich ist: http://archives.java.sun.com/cgi-bin/wa?A2=ind9811&L=ejb-interest&P=27675


----------



## tuxedo (26. Jul 2007)

wenn du ausschließen kannst dass es in Col1 und Coln duplikate gibt kannst du doch nach den eingefügten Werten der Spalte SELECTieren ...


```
SELECT * FROM XYZ WHERE Col1 = 'ein text' AND Coln = 123
```

aber das wird wohl nur bei einfachen Datenbanken der Fall sein.


----------



## Yzebär (26. Jul 2007)

Du kannst den PrimaryKey deiner Tabelle im Programm berechnen und beim Insert mit angeben. Danach kannst du mit diesem PrimaryKey den soeben gespeicherten Datensatz wieder von der Datenbank lesen. Du mußt nur darauf achten, daß dein berechneter PK eindeutig ist.


----------



## ARadauer (26. Jul 2007)

```
ResultSet rset = statement.getGeneratedKeys();
int lastKey = rset.getInt(1);
```


wobei statement dein Statment ist wo du dein executeUpdate aufgerufen hast.


----------



## Bjoern2 (27. Jul 2007)

ARadauer hat gesagt.:
			
		

> ```
> ResultSet rset = statement.getGeneratedKeys();
> int lastKey = rset.getInt(1);
> ```
> ...


Wird leider von postgreSQL nicht unterstützt. :-(


----------



## Bjoern2 (27. Jul 2007)

Yzebär hat gesagt.:
			
		

> Du kannst den PrimaryKey deiner Tabelle im Programm berechnen und beim Insert mit angeben. Danach kannst du mit diesem PrimaryKey den soeben gespeicherten Datensatz wieder von der Datenbank lesen. Du mußt nur darauf achten, daß dein berechneter PK eindeutig ist.


Der PK muss leider über die Sequenz berechnet werden.
Hier hätte ich dann wieder das Problem, dass ich ein allgemein gültiges SQL-Statement basteln müsste um an den Wert der erhöhten Sequenz zu kommen.
Weil ich nicht weiß, wie die Dummy-Tabelle (z.B. dual) in der DB heißt, kann ich das leider auch nicht machen. :-(


----------



## Bjoern2 (27. Jul 2007)

alex0801 hat gesagt.:
			
		

> *wenn du ausschließen kannst* dass es in Col1 und Coln duplikate gibt kannst du doch nach den eingefügten Werten der Spalte SELECTieren ...


Kann ich leider, leider nicht.


----------



## tuxedo (27. Jul 2007)

Bjoern2 hat gesagt.:
			
		

> Kann ich leider, leider nicht.



Hmm.. Ich glaub dann hast du, da die anderen Lösungen bei dir offensichtlich auch nicht gehen, ein Problem :-(
Frag doch mal in einem Postgres-Forum.. Vielleicht gibts Möglichkeiten das datenbankseitig zu lösen.


----------



## Bjoern2 (27. Jul 2007)

alex0801 hat gesagt.:
			
		

> Hmm.. Ich glaub dann hast du, da die anderen Lösungen bei dir offensichtlich auch nicht gehen, ein Problem :-(
> Frag doch mal in einem Postgres-Forum.. Vielleicht gibts Möglichkeiten das datenbankseitig zu lösen.


Naja. Datenbankseitig könnte ich das auch lösen.
Problem ist nur, dass ich z.B. an der physischen Struktur nichts fummeln darf.
Außerdem brauch ich ja im Java-Programm die geänderten Werte. Die muss ich ja auch irgenwie wieder abfragen können.
Normalerweiße geht das perkeft über getAutoGeneratedKeys (wie oben erwähnt). Nur Postgres unterstützt das ja leider nicht.
Es gibt in PostgreSQL zwar die Möglichkeit über die ObjectID, welche für jeden Datensatz über die ganze Datenbank hinweg einzigartig ist, den Datensatz wieder zu empfangen (der JDBC-Treiber würde das sogar unterstützen), aber ich brauche, wie gesagt, eine Lösung die unabhängig von der DB-Art funktioniert.
Außerdem gibts hier wiederum das Problem, dass ich postgres-Tabellen habe, die explizit die ObjectID deaktiviert haben. Also kann ich mich da auch leider nicht drauf verlassen. :-(


----------



## tuxedo (27. Jul 2007)

Fassen wir also zusammen:

a) Es muss DB-Unabhängig funktionieren, sprich: es soll auch mit MySQL gehen?
b) Im Moment kannst du nur Postgres verwenden welches eine Java-Seitige Lösung nicht erlaubt?
c) Es muss auf Java-Seite gelöst werden

Für mich sieht das düster aus ... Ende der Einbahnstraße.


----------

