如何将当前序列值存储到变量中,以便在序列递增后在其他地方使用它。
我基本上想存储当前的序列值,然后用它来从表中选择行。
CREATE SEQUENCE mySequence
INCREMENT BY 5
START WITH 100;
DECLARE myVar NUMBER(5);
BEGIN
myVar := mySequence.CURRVAL;
END;
INSERT INTO myTable (my_id, my_datetime)
SELECT mySequence.NEXTVAL,
my_datetime + 5,
FROM myTable
WHERE my_id = myVar;
2条答案
按热度按时间qgzx9mmu1#
如果你只是想知道一个序列生成了什么序列值,你有两个简单的选择:
1.使用
RETURNING
子句:你可以用任何你喜欢的方式使用它:
1.或者,更简单地说,在插入之前,直接将序列赋给变量:
现在你可以用
myVar
做任何你想做的事情。但是,如果您的目标是基于前一行创建一个新行,则需要使用
MAX
来查找最后一行:但是如果你这样做了,就没有必要使用序列了,因为你可以简单地递增:
序列用作不需要的(或不可用的)自然键的替代项,并且在插入新值而不依赖于现有行时最有意义。
pexxcrt22#
在调用
nextval
之前,currval
通常没有意义。你可以在时间t1有一个会话的值为1,在时间t2有另一个会话的值为21,然后在时间t3第一个会话的值为2。因此,21是从序列中检索到的最大值,而2是任何会话检索到的最新值。其中一些可能对您可见,因为事务已经提交,而其他的可能还不可见。根据您真正要解决的问题,您可以选择
max(my_id)
值或create_date
最大的my_id
值。