Последовательность Oracle nextval и currval запутывают

В моей процедуре я пишу это

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;

Я хотел бы знать, почему оракул получает значение последовательности таким образом?

Ответы

Ответ 1

Если у вас было три отдельных заявления:

  1. NEXTVAL

  2. CURRVAL

  3. NEXTVAL

Тогда вы будете правы. Но у вас есть только два

  1. NEXTVAL

  2. currval и nextval

Currval и nextval являются частью одного атомарного шага - currval не обрабатывается до nextval.

Для этого вам понадобятся переменные:

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 ;

Ответ 2

Чтобы следить за христианским объяснением, это документированное поведение:

Если какое-либо из этих мест содержит ссылки как на CURRVAL и на NEXTVAL, Oracle увеличивает последовательность и возвращает одно и то же значение для CURRVAL и NEXTVAL.

"Местоположение" в этом случае является элементом из предыдущего списка "каждый оператор INSERT содержащий предложение VALUES ".