Последовательность 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
Если у вас было три отдельных заявления:
-
NEXTVAL
-
CURRVAL
-
NEXTVAL
Тогда вы будете правы. Но у вас есть только два
-
NEXTVAL
-
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
".