Ihr ursprünglicher Ansatz birgt mehrere Probleme. Die gewählte Antwort bietet zwar eine korrekte Möglichkeit, den aktuellen Wert der Sequenz zu bestimmen, geht aber nicht auf diese Probleme ein:
-
Der Wert der Sequenz könnte sich zwischen dem Aufruf von NEXTVAL und CURRVAL geändert haben. Dies führt zu einem schwer zu erkennenden Fehler und es besteht die Möglichkeit, dass Sie einen Wert erhalten, der von einer anderen Sitzung verwendet wird. Verwenden Sie die Rückgabeklausel in der Einfügeanweisung, um den tatsächlich eingefügten Wert abzurufen.
-
Ihre Variablennamen sind die gleichen wie die Namen Ihrer Spalten. Dies führt zu schwer zu erkennenden Fehlern in Abfragen, die in PL/SQL-Blöcke eingebettet sind. Vergewissern Sie sich, dass Ihre Variablen anders benannt sind - Sie können sie dem Typnamen voranstellen, z. B. v_userid anstelle von userid.
-
SELECT-Anweisung innerhalb eines Oracle PL/SQL-Blocks erfordert eine INTO-Klausel. Ejemplo:
SELECT userid INTO v_userid FROM bs_orders WHERE ono = orderNumberSEQ;
-
Die Unterabfrage für current_timestamp ist redundant. Sie können anstelle der Unterabfrage einfach CURRENT_TIMESTAMP verwenden, um das gleiche Ergebnis zu erzielen.
-
Anstatt den Spaltentyp manuell anzugeben. Verankern Sie ihn mit dem genauen Tabellentyp, indem Sie die Notation %type verwenden.
v_userid bs_orders.userid%type;
Der folgende Code behandelt alle 5 Punkte.
DECLARE
v_userid bs_orders.userid%type; -- anchoring the type
BEGIN
INSERT INTO bs_orders(userid , ono , timepurchased)
VALUES('lilith', orderNum_seq.NEXTVAL, CURRENT_TIMESTAMP)
RETURNING userid INTO v_userid; -- instead of currval and an additional select
-- do whatever you want with v_userid here
END;
/