据我所知,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 是没有意义的(并且会返回错误)。