获取从 C# (oracle) 调用的插入语句使用的序列号
Posted
技术标签:
【中文标题】获取从 C# (oracle) 调用的插入语句使用的序列号【英文标题】:Get seq number used by insert statement called from C# (oracle) 【发布时间】:2010-09-23 23:05:56 【问题描述】:我需要在表中插入一条记录并将列的值(例如 orderid)设置为唯一的 #。并返回使用的号码。
我认为该过程将使用序列和带有 nextval 的插入语句:
insert into ordersTable(orderid) values(ordernums.nextval);
但是如何获得使用的号码?我的想法是我必须从插入调用中取回它,否则如果我重新查询,nextval(或currval)可能会改变。
但我不知道该怎么做。我认为解决此问题的一种方法是,在插入时,还将我唯一的唯一值添加到字段中,然后重新查询该值。
还有其他方法可以做到这一点吗?我想我可能在 sql 级别遗漏了一些东西?
CtC
【问题讨论】:
【参考方案1】:据我所知,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 是没有意义的(并且会返回错误)。
【讨论】:
以上是关于获取从 C# (oracle) 调用的插入语句使用的序列号的主要内容,如果未能解决你的问题,请参考以下文章