Насколько я знаю, в 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 зависит от сеанса, это не имеет смысла (и будет возвращать ошибку), если вы вызывали CURRVAL в сеансе до того, как вызывали NEXTVAL для той же последовательности.