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

cod*_*die 2 sql oracle plsql sequences

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

我认为该过程将使用序列和带有nextval的insert语句:

insert into ordersTable(orderid) values(ordernums.nextval);
Run Code Online (Sandbox Code Playgroud)

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

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

还有另一种方法吗?我想我可能在sql级别丢失了一些东西?

CTC

OMG*_*ies 9

据我所知,Oracle 9i +有RETURNING子句:

DECLARE v_orderid ORDERSTABLE%TYPE;

INSERT INTO ordersTable
 (orderid) 
VALUES
 (ordernums.nextval)
RETURNING orderid INTO v_orderid;
Run Code Online (Sandbox Code Playgroud)

另一种方法是在INSERT语句之前填充变量:

在一个函数内:

DECLARE v_orderid ORDERSTABLE%TYPE := ORDERNUMS.NEXTVAL;

INSERT INTO ordersTable
 (orderid) 
VALUES
 (v_orderid);

RETURN v_orderid;
Run Code Online (Sandbox Code Playgroud)

使用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;
Run Code Online (Sandbox Code Playgroud)

此外,请注意序列的CURRVAL是特定于会话的.不管多长时间,因为你在当前会话称为NEXTVAL不管多少其他会话可能已在同一序列称为NEXTVAL,ordernums.currval总是返回这是给你的对话的信息序列的最后一个值.因此,虽然您有各种从INSERT中检索值的选项,但可能没有必要 - 您可能只想在后续语句中引用ordernums.currval.当然,由于CURRVAL是会话特有的,它没有任何意义(并且会返回一个错误),如果你在一个会议要求CURRVAL你呼吁NEXTVAL为同一序列之前.