我需要在表中插入一条记录,并将列的值(例如orderid)设置为唯一的#。并返回使用的数字。
我认为这个过程是使用带有nextval的序列和insert语句:
insert into ordersTable(orderid) values(ordernums.nextval);
但是如何获得使用的号码?我的想法是我必须从插入调用中取回它,否则如果我重新查询则nextval(或currval)可能已经改变。
但我不知道该怎么做。解决这个问题的另一种方法是,在插入时,还将我唯一的唯一值添加到字段中,然后重新查询该值。
还有其他办法吗?我想我可能在sql级别丢失了一些东西?
CtC
答案 0 :(得分:9)
据我所知,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;
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,则它没有意义(并且会返回错误)。