Oracle SQL存储当前序列值

0yycz8jy  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(97)

如何将当前序列值存储到变量中,以便在序列递增后在其他地方使用它。
我基本上想存储当前的序列值,然后用它来从表中选择行。

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;
qgzx9mmu

qgzx9mmu1#

如果你只是想知道一个序列生成了什么序列值,你有两个简单的选择:
1.使用RETURNING子句:

INSERT INTO myTable (my_id, my_datetime)
VALUES(mySequence.NEXTVAL,SYSDATE)  
RETURNING my_id INTO myVar;

你可以用任何你喜欢的方式使用它:

SELECT COUNT(*)
  INTO var_exists
  FROM myTable
 WHERE my_id = myVar;

1.或者,更简单地说,在插入之前,直接将序列赋给变量:

myVar := mySequence.NEXTVAL;

INSERT INTO myTable (my_id, my_datetime)
VALUES(myVar,SYSDATE);

现在你可以用myVar做任何你想做的事情。
但是,如果您的目标是基于前一行创建一个新行,则需要使用MAX来查找最后一行:

INSERT INTO myTable (my_id, my_datetime)
SELECT mySequence.NextVal,
       my_Datetime + 5
  FROM myTable
 WHERE my_id = (SELECT MAX(my_id)
                  FROM myTable);

但是如果你这样做了,就没有必要使用序列了,因为你可以简单地递增:

INSERT INTO myTable (my_id, my_datetime)
SELECT my_id + 1,
       my_Datetime + 5
  FROM myTable
 WHERE my_id = (SELECT MAX(my_id)
                  FROM myTable);

序列用作不需要的(或不可用的)自然键的替代项,并且在插入新值而不依赖于现有行时最有意义。

pexxcrt2

pexxcrt22#

在调用nextval之前,currval通常没有意义。你可以在时间t1有一个会话的值为1,在时间t2有另一个会话的值为21,然后在时间t3第一个会话的值为2。因此,21是从序列中检索到的最大值,而2是任何会话检索到的最新值。其中一些可能对您可见,因为事务已经提交,而其他的可能还不可见。
根据您真正要解决的问题,您可以选择max(my_id)值或create_date最大的my_id值。

相关问题