私の知る限り、Oracle 9i+ には RETURNING 句があります。
DECLARE v_orderid ORDERSTABLE%TYPE;
INSERT INTO ordersTable
(orderid)
VALUES
(ordernums.nextval)
RETURNING orderid INTO v_orderid;
別の方法は、INSERT ステートメントの前に変数を設定することです。
関数内:
DECLARE v_orderid ORDERSTABLE%TYPE := ORDERNUMS.NEXTVAL;
INSERT INTO ordersTable
(orderid)
VALUES
(v_orderid);
RETURN v_orderid;
OUT パラメータの使用:
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;
さらに、シーケンスの CURRVAL はセッション固有であることに注意してください。現在のセッションで NEXTVAL を呼び出してからどれくらい経っても、同じシーケンスで NEXTVAL を呼び出した他のセッションがいくつあっても、 ordernums.currval は常に、セッションに与えられたシーケンスの最後の値を返します。そのため、INSERT から値を取得するためのさまざまなオプションがありますが、必要ではない場合があります。後続のステートメントで ordernums.currval を参照するだけでよいのです。もちろん、CURRVAL はセッション固有であるため、同じシーケンスに対して NEXTVAL を呼び出す前にセッションで CURRVAL を呼び出しても意味がありません (エラーが返されます)。