Sql 使用触发器插入后读取序列值?
我正在用Pro*C开发一个小应用程序,但我有一个关于其中一个主要功能的问题 我对每个表的标识符都有一个自动递增触发器,因此在将行插入表之前,触发器设置行的idSql 使用触发器插入后读取序列值?,sql,oracle,triggers,sequence,auto-increment,Sql,Oracle,Triggers,Sequence,Auto Increment,我正在用Pro*C开发一个小应用程序,但我有一个关于其中一个主要功能的问题 我对每个表的标识符都有一个自动递增触发器,因此在将行插入表之前,触发器设置行的id 这里的问题是,我想在isert之后检索序列的值(以获取插入行的id),但是当两个事务试图插入行时会发生什么?如果我使用readcommitted级别并在插入行并检索其值后提交事务,会导致任何问题吗?我该怎么办?谢谢 两个会话可以独立插入行并参考currval,因为这是会话的本地操作 没有清楚地说明: 。。。对CURRVAL的任何引用都会返
这里的问题是,我想在isert之后检索序列的值(以获取插入行的id),但是当两个事务试图插入行时会发生什么?如果我使用readcommitted级别并在插入行并检索其值后提交事务,会导致任何问题吗?我该怎么办?谢谢 两个会话可以独立插入行并参考
currval
,因为这是会话的本地操作
没有清楚地说明:
。。。对CURRVAL的任何引用都会返回序列的当前值,即最后一次对NEXTVAL的引用返回的值
在会话中将CURRVAL用于序列之前,必须首先使用NEXTVAL初始化序列
综上所述,它们表明这是安全的,但第一部分并没有明确说明这是当前会话中最后一次提到NEXTVAL
。然而,它确实说:
序列可以由多个用户同时访问,而无需等待或锁定
但是,您不需要执行查询来获取ID,您可以使用
您目前如何获取该值?通过查询
currval
(在同一个会话中,即使已提交),使用返回
子句或其他方法?我通过查询currval
确定来获取insert语句后的值,而执行insert的两个事务在不同的会话中?它们是独立的,currval
是会话本地的。你真的有问题吗?或者只是想知道你所做的是否安全?插入将在不同的会话中进行,我只是想知道安全的方法是什么。但正如您所说,如果每个会话的值都是独立的,那么我不会有任何问题,对吗?currval
对此非常安全谢谢您的详细回答。我将在这里使用returning
子句。我不知道我可以用Pro*C。
insert into your_table (col1, ...) values (:val1, ...)
returning id into :id;