2016-02-02 2 views
0

я использовал этот код для генерации авто номер:Increment в Oracle Forms без фиксации записи

DECLARE 
ACC_NEW_ID NUMBER:=0; 
BEGIN 
if :acc_info_id is null then 
SELECT MAX(NVL(ACC_INFO_ID,1000))+1 INTO ACC_NEW_ID FROM ACC_INFO; 
:ACC_INFO_ID := ACC_NEW_ID; 
end if; 
END; 

Этот код работает отлично, но когда я создаю еще одну запись без нажатия кнопки сохранения создается тот же номер , Например: id равен 1003, и после публикации записи я нажал кнопку новой записи, а не кнопку сохранения. Он генерирует то же 1003 число вместо 1004, как я ожидал.

ответ

0

Ваш код запрашивает записи в таблице и возвращает максимальный ID , который он может видеть в тот момент времени (то есть он не увидит незафиксированные записи) и добавляет его к нему.

Если он генерирует 1003, но запись с этим значением не сохраняется в таблице, конечно, вы должны ожидать, что он не найдет его!

Что касается этого, он «работает отлично» и правильно. Если, однако, цель состоит в том, чтобы генерировать уникальное значение ID для каждой записи, этот подход является ошибочным и потерпит неудачу в любой нормальной системе из-за параллелизма.

Вместо этого, если вам нужен уникальный идентификатор, вы должны использовать Oracle SEQUENCE вместо этого, что гарантирует уникальность.

Смежные вопросы