2 Stimmen

Holen Sie sich die Seq-Nummer, die von der Einfügen-Anweisung verwendet wird, die von C# (Oracle) aufgerufen wird.

Ich muss einen Datensatz in eine Tabelle einfügen und den Wert einer Spalte (z. B. orderid) auf eine eindeutige Nummer setzen. Und diese verwendete Nummer zurückgeben.

Ich dachte, der Prozess würde darin bestehen, eine Sequenz zu verwenden und eine Insert-Anweisung mit nextval auszuführen:

insert into ordersTable(orderid) values(ordernums.nextval);

Aber wie bekomme ich die verwendete Nummer? Meine Überlegung ist, dass ich sie aus dem Insert-Aufruf zurückbekommen muss, da sonst der nextval (oder currval) geändert werden könnte, wenn ich erneut abfrage.

Aber ich bin mir nicht sicher, wie das geht. Ein Ausweg, den ich dachte, wäre, beim Einfügen auch meinen einzigen eindeutigen Wert in ein Feld hinzuzufügen und dann erneut nach diesem Wert zu fragen.

Gibt es einen anderen Weg, dies zu tun? Ich denke, ich übersehe wahrscheinlich etwas auf der SQL-Ebene?

CtC

9voto

OMG Ponies Punkte 312816

Soweit ich weiß, hat Oracle 9i+ die RETURNING-Klausel:

DECLARE v_orderid ORDERSTABLE%TYPE;

INSERT INTO ordersTable
 (orderid) 
VALUES
 (ordernums.nextval)
RETURNING orderid INTO v_orderid;

Die Alternative besteht darin, die Variable vor dem INSERT-Statement zu befüllen:

In einer Funktion:

DECLARE v_orderid ORDERSTABLE%TYPE := ORDERNUMS.NEXTVAL;

INSERT INTO ordersTable
 (orderid) 
VALUES
 (v_orderid);

RETURN v_orderid;

Verwendung eines OUT-Parameters:

CREATE OR REPLACE PROCEDURE ORDER_INS(out_orderid OUT ORDERSTABLE%TYPE) 
AS
BEGIN

out_orderid := ORDERNUMS.NEXTVAL;

INSERT INTO ordersTable
 (orderid) 
VALUES
 (out_orderid);

END;

Zusätzlich sei darauf hingewiesen, dass CURRVAL einer Sequenz sitzungsspezifisch ist. Unabhängig davon, wie lange es her ist, seit Sie NEXTVAL in der aktuellen Sitzung aufgerufen haben, und unabhängig davon, wie viele andere Sitzungen NEXTVAL für dieselbe Sequenz aufgerufen haben, wird ordernums.currval immer den letzten Wert der Sequenz zurückgeben, der Ihrer Sitzung zugewiesen wurde. Daher müssen Sie, obwohl Sie verschiedene Möglichkeiten haben, um den Wert aus dem INSERT abzurufen, möglicherweise nicht darauf zugreifen - Sie möchten möglicherweise einfach auf ordernums.currval in nachfolgenden Anweisungen verweisen. Natürlich ergibt CURRVAL nur Sinn, da CURRVAL sitzungsspezifisch ist und ein Fehler auftritt, wenn Sie CURRVAL in einer Sitzung aufrufen, bevor Sie NEXTVAL für dieselbe Sequenz aufgerufen haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X