Problem:
Ich lege nun fuer Table1 einen Datensatz an und moechte
sofort im Anschluss in Table2 ebenfalls einen Datensatz
anlegen mit der table1_id des kurz vorher angelegten
Datensatzes in Table1.
insert into table1 (table1\_id, blib)
values (MySequence.NextVal, 'test')
insert into table2 (table2\_id, table1\_id, blob)
values (MySequence.NextVal, ???, 'test')
Frage:
Wie bekomme ich die table1_id?
(Die id’s werden automatisch von einer Sequence geholt.)
Soll ich bevor ich den Datensatz in Table2 anlege ein
„select max(table1_id) from table1“ machen oder gibt
es eine bessere Loesung?
insert into table1 (table1_id, blib)
values (MySequence.NextVal, ‚test‘)
insert into table2 (table2_id, table1_id, blob)
values (MySequence.NextVal, ???, ‚test‘)
Frage:
Wie bekomme ich die table1_id?
(Die id’s werden automatisch von einer Sequence geholt.)
Soll ich bevor ich den Datensatz in Table2 anlege ein
„select max(table1_id) from table1“ machen oder gibt
es eine bessere Loesung?
Hallo Patrick!
Die gibt es! Es gibt für sequences neben nextval auch noch die pseudocolumn currval, die den zuletzt von der Sequence geholten Wert zurückgibt, ohne die Sequence zu erhöhen. WICHTIG: Die Sequence muß in der aktuellen Session zumindest einmal mit nextval initialisiert werden, bevor currval verwendet werden kann. In Deinem Beispiel wäre also „currval - 1“ einzusetzen. ACHTUNG! Das geht natürlich nur, wenn die beiden INSERTs wirklich nur einen Satz einfügen!
wobei ich eigentlich noch immer die „sichere“ variante mittels pl/sql bevorzuge und die sequence in eine variable lege … außer es muß schnell gehen und es ist nur ein satz einzufügen, dann hol ich mir vorher die sequence mittels select from dual und füg sie dann hardcodiert ein … currval hat so seine „schwächen“, sprich: multi-user-betrieb …
grüße,
tomh
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
… currval hat so seine
„schwächen“, sprich: multi-user-betrieb …
grüße,
tomh
Hi Tomh!
Frage: Wo siehst Du Schwächen im Zusammenhang mit currval und multi-user Betrieb? Den Wert der Sequence, den ich mir vorher mit nextval geholt habe bleibt innerhalb einer Session immer gleich, bis ich mir den nächsten Wert mit nextval geholt habe, unabhängig davon, was andere User / Sessions in der Zwischenzeit machen, und genau das erwarte ich mir doch.
ips, ich sollte lieber mein gehirn aktivieren, bevor ich currval mit select last_number from user_sequences vergleiche … genau da hatte ich meine probleme - keine ahnung, wie ich da plötzlich auf currval komme … grmpf … hab’s jetzt extra im multi-user-betrieb ausprobiert und currval funktioniert wirklich einwandfrei … sorrry für den schnellschuß …
grüße,
tomh
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]