Oracle 序列 nextval 和 currval 令人困惑

标签 oracle plsql

在我的程序中,我写了这个

INSERT INTO questions(id, value) VALUES(my_seq.NEXTVAL, p_question);

INSERT INTO DEPENDENCIES(parent_question_id, child_question_id)
VALUES (my_seq.CURRVAL, my_seq.NEXTVAL);

假设序列的最后一个值等于 1。在这种情况下,我期望这个结果:
 my_seq.NEXTVAL = 2;
 my_seq.CURRVAL = 2;
 my_seq.NEXTVAL = 3;

但它插入了这个:
 my_seq.NEXTVAL = 2;
 my_seq.CURRVAL = 3;
 my_seq.NEXTVAL = 3;

我想知道oracle为什么以这种方式检索序列值?

最佳答案

如果您有三个单独的陈述:

  • nextval
  • 电流
  • nextval

  • 那你就对了。但你只有两个
  • nextval
  • currval 和 nextval

  • Currval 和 nextval 是单个原子步骤的一部分 - 在 nextval 之前不会处理 currval。

    您需要为此使用变量:
    DECLARE
      l_parent_question_id     NUMBER ;
      l_child_question_id      NUMBER ;
    BEGIN
      l_parent_question_id := my_seq.NEXTVAL ;
    
      INSERT INTO questions(id, value) VALUES(l_parent_question_id, p_question);
    
      l_child_question_id := my_seq.NEXTVAL ;
    
      INSERT INTO DEPENDENCIES(parent_question_id, child_question_id)
      VALUES (l_parent_question_id, l_child_question_id); 
    
    END ;
    

    关于Oracle 序列 nextval 和 currval 令人困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51148996/

    相关文章:

    java - 日期正在以时间格式合并

    java - 使用 Hibernate 或 Spring 打印 DBMS_OUTPUT.put_line

    oracle - 在异常处理程序中查找作业编号

    linux - [01000][unixODBC][驱动程序管理器]无法打开 lib '/usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so' : file not found

    regex - Oracle中使用正则表达式按分隔符分割字符串

    c++ - 从 Pro*C 连接获取 OCCI 连接?

    oracle - SELECT COUNT(*) 与使用显式游标获取两次

    plsql - 用于测试字符串是否为数字的简单 PL/SQL 函数

    java - 如何在jsp中显示SQL的结果?

    mysql - 如何使用sql查询计算比率?