Nach einer Migration der Datenbank von MySQL auf Oracle XE sollte auch das QT-Programm entsprechend angepasst werden. In MySQL kann man die zuletzt generierte ID entweder über das Qt-interne lastInsertId() abrufen (bei nativem MySQL-Treiber) oder aber mit “SELECT LAST_INSERTID() “.
Zwar soll der OCI-Treiber zumindest lastInsertId() kennen (hasFeature() lieferte true) aber irgendwie kommt immer nur 0 zurück.

Nach einiger Überlegung habe ich dann eine temporäre Tabelle angelegt, in der die entsprechenden ID’s gelegt werden sollten.
Im SQL-Developer und auf Kommandozeile ging das auch problemlos, allerdings gibt es bei Abruf über QSqlQuery immer das Problem, dass die Tabelle leer ist. Das kommt dann entweder dadurch, dass ggf. das exec des vorherigen Statements bereits autocommitted wurde, was eigentlich nicht sein dürfte, oder grundsätzlich ein Abruf einer temporären Tabelle nicht in Qt funktioniert. Wie auch immer, diese Idee führte nach gefühlten 8 Stunden herumprobieren nicht zum Ziel.

Mit ein wenig PL/SQL konnte ich das ganze dann aber doch lösen:

Erzeugen eines Packages mit einer globalen Variablen und einer get-Funktion.
Die get-Funktion liefert den Wert der globalen Package-Variablen zurück und setzt sie anschließend auf NULL.
Die Before-Insert-Trigger schreiben ihre generierte ID in die Package-Variablen.

Wird dann also die get-Funktion aufgerufen, wird die zuletzt generierte ID des letzen ausgeführten Statements in der Session ermittelt und zurück geliefert. Durch das anschließende Leeren der Package-Variablen wird dann dafür gesorgt, dass man keine alten Werte bekommt, die ggf. bei der Ausführung von anderen ID-Generierungen zurück geblieben sind.

Aufpassen muss man hierbei, wenn Tabellen durch weitere Trigger automatisch befüllt werden. In diesem Fall sollte ggf. der globale Wert nicht gesetzt werden.

Schreibe einen Kommentar

Artikel, die Dir auch gefallen könnten

Remote-Desktop unter Manjaro

Hallo da draußen, Leute die mich etwas besser kennen, wissen, dass ich ein großer Fan von Manjaro Linux bin. Ich nutze das schon seit etlichen

mehr...