Oracle последовательность nextval и currval сбивают с толку - PullRequest
0 голосов
/ 03 июля 2018

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

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 получает значение последовательности таким образом?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

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

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

«location» в данном случае - это элемент из списка, предшествующего этому, «каждый оператор INSERT, содержащий предложение VALUES».

0 голосов
/ 03 июля 2018

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

  1. nextval

  2. CURRVAL

  3. NEXTVAL

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

  1. NEXTVAL

  2. curvval и 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 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...