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

Read a Sequence value after insert with a trigger?

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

我有一个用于每个 table 标识符的自动递增触发器,因此在行被插入 table 之前,触发器会设置行的 ID。

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

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

The documentation 没有说清楚:

... Any reference to CURRVAL always returns the current value of the sequence, which is the value returned by the last reference to NEXTVAL.

Before you use CURRVAL for a sequence in your session, you must first initialize the sequence with NEXTVAL.

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

A sequence can be accessed by many users concurrently with no waiting or locking.

不过,你不需要做查询来获取ID,你可以使用the returning into clause

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