使用触发器插入后读取序列值?

时间:2016-05-17 14:11:56

标签: sql oracle triggers sequence auto-increment

我在Pro * C中开发了一个小应用程序,但我对其中一个主要功能有疑问。

我有一个自动增量触发器用于每个表的标识符,所以在将行插入表之前,触发器设置行的id。

这里的问题是我想在isert之后检索序列的值(以获取插入的行的id),但是当两个事务试图插入一行时会发生什么?如果我使用read-commited级别并在插入行后提交事务并检索它的值会导致任何问题?我该怎么办?谢谢!

1 个答案:

答案 0 :(得分:1)

两个会话独立插入行并引用currval是安全的,因为它是会话的本地。

The documentation并没有明确表示:

  

...对CURRVAL的任何引用始终返回序列的当前值,该值是最后一次引用NEXTVAL返回的值。

     

在对会话中的序列使用CURRVAL之前,必须先使用NEXTVAL初始化序列。

总之,它们表明它是安全的,但第一部分并没有真正说明它是当前会话中NEXTVAL 的最后一个引用。但是,它确实说:

  

许多用户可以同时访问序列,无需等待或锁定。

但是,您无需进行查询即可获取ID,您可以使用the returning into clause

insert into your_table (col1, ...) values (:val1, ...)
returning id into :id;