获取从C#(oracle)调用的insert语句使用的seq编号

时间:2010-09-23 23:05:57

标签: sql oracle plsql sequences

我需要在表中插入一条记录,并将列的值(例如orderid)设置为唯一的#。并返回使用的数字。

我认为这个过程是使用带有nextval的序列和insert语句:

insert into ordersTable(orderid) values(ordernums.nextval);

但是如何获得使用的号码?我的想法是我必须从插入调用中取回它,否则如果我重新查询则nextval(或currval)可能已经改变。

但我不知道该怎么做。解决这个问题的另一种方法是,在插入时,还将我唯一的唯一值添加到字段中,然后重新查询该值。

还有其他办法吗?我想我可能在sql级别丢失了一些东西?

CtC

1 个答案:

答案 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;

使用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,则它没有意义(并且会返回错误)。