如何在Oracle SQL的WHERE子句中使用序列值?
在WHERE子句中使用序列最后生成值的正确方法
序列的
CURRVAL代表当前会话里序列最后一次生成的值,你可以直接在WHERE子句里用它,但要注意只能在当前会话内生效,而且必须先调用过NEXTVAL才能使用CURRVAL。你的SQL存在两个问题:
- 第一个
INSERT语句里,TO_DATE('2023/10/03', 'yyyy/mm/dd')和3之间缺少逗号,属于语法错误。 - 第二个
INSERT的WHERE条件my_no = my_no_s.CURRVAL -5逻辑不对:你第一个NEXTVAL生成的是100,CURRVAL就是100,减5得到95,但你刚插入的my_no是100,这个条件根本匹配不到任何记录。
- 第一个
正确的写法是直接用
CURRVAL匹配刚插入的那条记录:
CREATE SEQUENCE my_no_s INCREMENT BY 5 START WITH 100; -- 修正第一个INSERT的语法错误 INSERT INTO myTable VALUES ( my_no_s.NEXTVAL, TO_DATE('2023/10/03', 'yyyy/mm/dd'), 3 ); -- 使用CURRVAL匹配刚插入的记录 INSERT INTO myTable (m_no, m_datetime, m_roomno) SELECT my_no_s.NEXTVAL, my_datetime + 10, my_roomno FROM myTable WHERE my_no = my_no_s.CURRVAL;
- 要是你需要在后续操作里反复用这个序列值,也可以先把
CURRVAL存到变量里,避免当前会话后续调用NEXTVAL改变它的值:
DECLARE v_last_seq NUMBER; BEGIN INSERT INTO myTable VALUES ( my_no_s.NEXTVAL, TO_DATE('2023/10/03', 'yyyy/mm/dd'), 3 ); -- 把当前序列值存入变量 v_last_seq := my_no_s.CURRVAL; INSERT INTO myTable (m_no, m_datetime, m_roomno) SELECT my_no_s.NEXTVAL, my_datetime + 10, my_roomno FROM myTable WHERE my_no = v_last_seq; END; /
内容的提问来源于stack exchange,提问作者Grandmarkkk
相关产品推荐
相关产品推荐

