2016-05-17 19 views
1

Ich entwickle eine kleine App in Pro * C, aber ich habe eine Frage mit einer der Hauptfunktionen.Lesen Sie einen Sequenzwert nach dem Einfügen mit einem Trigger?

Ich habe einen Autoinkrement-Trigger für den Bezeichner jeder Tabelle. Bevor die Zeile in die Tabelle eingefügt wird, legt der Trigger die ID der Zeile fest.

Das Problem hier ist, dass ich den Wert der Sequenz nach einem isert abrufen möchte (um die ID der Zeile einzufügen), aber was passiert, wenn zwei Transaktionen versuchen, eine Zeile einzufügen? Wenn ich die Read-Committed-Ebene verwende und die Transaktion nach dem Einfügen der Zeile festlege und den Wert abrufe, kann das zu Problemen führen. Was soll ich machen? Vielen Dank!

+0

verwenden Wie zur Zeit den Wert zu bekommen? Durch die Abfrage nach 'currval' (in der gleichen Sitzung, auch wenn sie ausgeführt wurde), mit der' reving'-Klausel oder etwas anderem? –

+0

Ich bekomme den Wert nach der Insert-Anweisung durch Abfragen von 'currval' –

+1

OK, und die zwei Transaktionen, Inserts sind in verschiedenen Sitzungen? Sie sind unabhängig, 'currval' ist lokal in der Sitzung. Hast du tatsächlich ein Problem oder einfach nur herausfinden, ob das, was du tust, sicher ist? –

Antwort

1

Es ist sicher für zwei Sitzungen, Zeilen unabhängig voneinander einzufügen und sich auf currval zu beziehen, da es lokal für die Sitzung ist.

The documentation nicht ruhig Zustand, die eindeutig:

... Jede Bezugnahme auf CURRVAL immer den aktuellen Wert der Sequenz zurückgibt, die den Wert der letzte Verweis auf NEXTVAL zurückgekehrt ist.

Bevor Sie CURRVAL für eine Sequenz in Ihrer Sitzung verwenden, müssen Sie zuerst die Sequenz mit NEXTVAL initialisieren.

Zusammengenommen zeigen sie, es ist sicher, aber der erste Teil davon nicht wirklich klar machen, dass es die letzte Referenz auf NEXTVALin der aktuellen Sitzung. Es heißt jedoch:

Eine Sequenz kann von vielen Benutzern gleichzeitig ohne Warten oder Sperren zugegriffen werden.

Allerdings brauchen Sie nicht eine Abfrage zu tun, um die ID zu bekommen, Sie the returning into clause

insert into your_table (col1, ...) values (:val1, ...) 
returning id into :id; 
+0

Danke für Ihre ausführliche Antwort. Ich werde hier die "Rückkehr" -Klausel verwenden. Ich weiß nicht, ob ich es mit Pro * C benutzen kann. –