You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Oracle SQL的WHERE子句中使用序列值?

在WHERE子句中使用序列最后生成值的正确方法
  • 序列的CURRVAL代表当前会话里序列最后一次生成的值,你可以直接在WHERE子句里用它,但要注意只能在当前会话内生效,而且必须先调用过NEXTVAL才能使用CURRVAL。

  • 你的SQL存在两个问题:

    1. 第一个INSERT语句里,TO_DATE('2023/10/03', 'yyyy/mm/dd')和3之间缺少逗号,属于语法错误。
    2. 第二个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 06:00:16