Блог им. qubit →
Особенности Sequences в Oracle
Итак, некоторые особенности работы последовательностей в Oracle.
В MySQL для создания уникального ключа есть такая прелесть как auto_increment поле.
В Oracle такй возможности нет — для этого используется инструмент Sequence, из которого можно вытягивать нужные значения. Допустим у нас есть последовательность some_sequence. Что бы получить следующее значение нужно считать его поле some_sequence.nextval. Что бы получить текущее значение последовательности нужно обратиться к полю some_sequence.currval.
Теперь вопрос к гуру Oracle
Какой результат вернет запрос
Если следовать элементарной логике, в результате должны получить что-то типа

Однако на самом деле получаем совершенно другой результат:

Что это значит? На элементарную транзакцию, которая выполняется в одном запросе sequence срабатывает всего 1 раз, и когда во второй раз пытаемся вывести SOME_SEQUENCE.NEXTVAL берется значение которое сгенерировалось первым выводом. Анологично работает SOME_SEQUENCE.CURRVAL.
В MySQL для создания уникального ключа есть такая прелесть как auto_increment поле.
В Oracle такй возможности нет — для этого используется инструмент Sequence, из которого можно вытягивать нужные значения. Допустим у нас есть последовательность some_sequence. Что бы получить следующее значение нужно считать его поле some_sequence.nextval. Что бы получить текущее значение последовательности нужно обратиться к полю some_sequence.currval.
Теперь вопрос к гуру Oracle
Какой результат вернет запрос
SELECT SOME_SEQUENCE.NEXTVAL,
SOME_SEQUENCE.CURRVAL,
SOME_SEQUENCE.NEXTVAL,
SOME_SEQUENCE.CURRVAL
FROM DUAL
SOME_SEQUENCE.CURRVAL,
SOME_SEQUENCE.NEXTVAL,
SOME_SEQUENCE.CURRVAL
FROM DUAL
Если следовать элементарной логике, в результате должны получить что-то типа

Однако на самом деле получаем совершенно другой результат:

Что это значит? На элементарную транзакцию, которая выполняется в одном запросе sequence срабатывает всего 1 раз, и когда во второй раз пытаемся вывести SOME_SEQUENCE.NEXTVAL берется значение которое сгенерировалось первым выводом. Анологично работает SOME_SEQUENCE.CURRVAL.



