{"id":70,"date":"2013-01-30T21:48:52","date_gmt":"2013-01-30T21:48:52","guid":{"rendered":"http:\/\/devblog.cssec.de\/?p=70"},"modified":"2018-11-13T21:49:49","modified_gmt":"2018-11-13T21:49:49","slug":"qt4-lastinsertid-mit-oci-driver","status":"publish","type":"post","link":"https:\/\/www.cssec.de\/blog\/2013\/01\/30\/qt4-lastinsertid-mit-oci-driver\/","title":{"rendered":"Qt4: LastInsertId mit OCI-Driver"},"content":{"rendered":"<p>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 \u00fcber das Qt-interne lastInsertId() abrufen (bei nativem MySQL-Treiber) oder aber mit \u201cSELECT LAST_INSERTID() \u201c.<br \/>\nZwar soll der OCI-Treiber zumindest lastInsertId() kennen (hasFeature() lieferte true) aber irgendwie kommt immer nur 0 zur\u00fcck.<\/p>\n<p>Nach einiger \u00dcberlegung habe ich dann eine tempor\u00e4re Tabelle angelegt, in der die entsprechenden ID\u2019s gelegt werden sollten.<br \/>\nIm SQL-Developer und auf Kommandozeile ging das auch problemlos, allerdings gibt es bei Abruf \u00fcber 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\u00fcrfte, oder grunds\u00e4tzlich ein Abruf einer tempor\u00e4ren Tabelle nicht in Qt funktioniert. Wie auch immer, diese Idee f\u00fchrte nach gef\u00fchlten 8 Stunden herumprobieren nicht zum Ziel.<\/p>\n<p>Mit ein wenig PL\/SQL konnte ich das ganze dann aber doch l\u00f6sen:<\/p>\n<p>Erzeugen eines Packages mit einer globalen Variablen und einer get-Funktion.<br \/>\nDie get-Funktion liefert den Wert der globalen Package-Variablen zur\u00fcck und setzt sie anschlie\u00dfend auf NULL.<br \/>\nDie Before-Insert-Trigger schreiben ihre generierte ID in die Package-Variablen.<\/p>\n<p>Wird dann also die get-Funktion aufgerufen, wird die zuletzt generierte ID des letzen ausgef\u00fchrten Statements in der Session ermittelt und zur\u00fcck geliefert. Durch das anschlie\u00dfende Leeren der Package-Variablen wird dann daf\u00fcr gesorgt, dass man keine alten Werte bekommt, die ggf. bei der Ausf\u00fchrung von anderen ID-Generierungen zur\u00fcck geblieben sind.<\/p>\n<p>Aufpassen muss man hierbei, wenn Tabellen durch weitere Trigger automatisch bef\u00fcllt werden. In diesem Fall sollte ggf. der globale Wert nicht gesetzt werden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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 \u00fcber das Qt-interne lastInsertId() abrufen (bei nativem MySQL-Treiber) oder aber mit \u201cSELECT LAST_INSERTID() \u201c. Zwar soll der OCI-Treiber zumindest lastInsertId() kennen (hasFeature() lieferte true) aber irgendwie kommt immer nur [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"_links":{"self":[{"href":"https:\/\/www.cssec.de\/blog\/wp-json\/wp\/v2\/posts\/70"}],"collection":[{"href":"https:\/\/www.cssec.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cssec.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cssec.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cssec.de\/blog\/wp-json\/wp\/v2\/comments?post=70"}],"version-history":[{"count":2,"href":"https:\/\/www.cssec.de\/blog\/wp-json\/wp\/v2\/posts\/70\/revisions"}],"predecessor-version":[{"id":275,"href":"https:\/\/www.cssec.de\/blog\/wp-json\/wp\/v2\/posts\/70\/revisions\/275"}],"wp:attachment":[{"href":"https:\/\/www.cssec.de\/blog\/wp-json\/wp\/v2\/media?parent=70"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cssec.de\/blog\/wp-json\/wp\/v2\/categories?post=70"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cssec.de\/blog\/wp-json\/wp\/v2\/tags?post=70"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}