Eingefügter Datensatz erneut abfragen.

Status
Nicht offen für weitere Antworten.

Bjoern2

Mitglied
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:
Code:
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:
Code:
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:
 
T

tuxedo

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

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

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

Yzebär

Bekanntes Mitglied
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

Top Contributor
Code:
ResultSet rset = statement.getGeneratedKeys();
int lastKey = rset.getInt(1);


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

Bjoern2

Mitglied
ARadauer hat gesagt.:
Code:
ResultSet rset = statement.getGeneratedKeys();
int lastKey = rset.getInt(1);


wobei statement dein Statment ist wo du dein executeUpdate aufgerufen hast.
Wird leider von postgreSQL nicht unterstützt. :-(
 

Bjoern2

Mitglied
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. :-(
 
T

tuxedo

Gast
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

Mitglied
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. :-(
 
T

tuxedo

Gast
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.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F SQLite Datensatz löschen Datenbankprogrammierung 13
B Mit Button einen Datensatz löschen Datenbankprogrammierung 2
S sql query, um bestimten datensatz zu finden Datenbankprogrammierung 33
D MySQL Neuen Datensatz mit "new" anlegen Datenbankprogrammierung 16
E Nur der letzte Datensatz wird in Tabelle geschrieben Datenbankprogrammierung 4
M Serienbrief aus Datensatz Datenbankprogrammierung 2
E Aufzählung liest nur ersten Datensatz Datenbankprogrammierung 14
S SQLite Selectanfrage lieft datensatz aber cursor ist leer Datenbankprogrammierung 2
M Designfrage zu Rows die sich auf einen Datensatz derselben Tabelle beziehen Datenbankprogrammierung 7
A MySQL Datensatz wird nicht richtig gelöscht Datenbankprogrammierung 6
L SQLite fügt nur den ersten Datensatz ein Datenbankprogrammierung 2
C Hibernate Datensatz löschen Datenbankprogrammierung 2
M Access Datensatz beinhaltet ESC-Zeichen Datenbankprogrammierung 3
U Nur den ersten Datensatz löschen wenn mehrere gleiche da sind Datenbankprogrammierung 2
C Gleichzeitiger Zugriff auf Datensatz Datenbankprogrammierung 5
Eldorado MySQL Hibernate - neuen Datensatz einfügen Datenbankprogrammierung 2
Java.getSkill() Datensatz / Tupel automatisch nach xy Tagen / Stunden löschen Datenbankprogrammierung 7
M Datensatz exklusiv öffnen Datenbankprogrammierung 5
M design issue: datensatz lange locken? Datenbankprogrammierung 10
M Datensatz aus Datenbank löschen Datenbankprogrammierung 6
T Theoriefrage : mehrere User vs gleichen Datensatz Datenbankprogrammierung 4
K Schnelle Methode um zu testen ob Datensatz existiert Datenbankprogrammierung 9
R datenbank - datensatz sucjen Datenbankprogrammierung 4
-MacNuke- Hibernate löscht jeden Datensatz einzeln? Datenbankprogrammierung 12
V Doppelten Datensatz vermeiden? Datenbankprogrammierung 7
S Überprüfen ob Datensatz existiert Datenbankprogrammierung 2
P SQL, nur jeder 5. Datensatz Datenbankprogrammierung 9
J Anzeige Button gibt immer nur 1. Datensatz aus DB aus Datenbankprogrammierung 8
M Letzter Datensatz mit auslesen(brauch kleinen Tipp) Datenbankprogrammierung 15
N SELECT: Datensatz sperren Datenbankprogrammierung 6
C vorheriegen oder letzten Datensatz Datenbankprogrammierung 2
K ResultSet: Erste Zeile ausgeben, Datensatz in String speiche Datenbankprogrammierung 13
W Nur ein Datensatz wird angezeigt, obwohl mehrere existieren Datenbankprogrammierung 7
C Datensatz einfügen und quittierung Datenbankprogrammierung 31
H letzter Datensatz wird nicht gefunden? Datenbankprogrammierung 6
F suche MySQl-Befehl um Datensatz an Tabellenende zu schreiben Datenbankprogrammierung 2
nonickatall MySQL SQL Abfrage erneut ausführen oder rs aktualisieren Datenbankprogrammierung 14

Ähnliche Java Themen

Neue Themen


Oben