Триггер / последовательность ORACLE 10g с автоматическим приращением не увеличивается, как запрограммировано - PullRequest
1 голос
/ 16 марта 2012

Я разработал следующую последовательность для БД ORACLE 10, которая автоинкрементирует столбец идентификатора таблицы с именем t_client от 1 (Триггер также разрабатывается и выполняется при появлении новых данных на этой таблице зарегистрировано)

Проблема в том, что иногда последовательность не увеличивается на 1 , если не на 21 . Я не нахожу проблему по ее увеличению на 21 . Вот пример кода

Secuence ClientConsecutive

CREATE SEQUENCE  user_owner.ClientConsecutive
MINVALUE 0 
MAXVALUE 999999999999999999999999999 
INCREMENT BY 1 
START WITH 1 
CACHE 20 
NOORDER NOCYCLE ;

Trigger_Client_ID

create or replace
TRIGGER user_owner.TRIGGER_CLIENT_ID 
BEFORE INSERT ON T_CLIENT
REFERENCING NEW AS NEW FOR EACH ROW
DECLARE valueSequence NUMBER := 0;
BEGIN
SELECT ClientConsecutive.NEXTVAL INTO valorSecuencia FROM DUAL;
:NEW.ID_CLIENTE := valueSequence;
END;

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

LAST_NUMBER 2

, что правильно, когда я регистрирую новые данные в пустой таблице, но иногда говорит

LAST_NUMBER 21

Есть идеи?

1 Ответ

4 голосов
/ 16 марта 2012

Последовательности Oracle не гарантируют отсутствие пробелов.Фактически, вы можете почти гарантировать, что иногда будут пропуски.

В вашем случае вы используете размер кэша по умолчанию, равный 20. Когда база данных закрыта или кэш последовательности устарелпамять, какие бы значения не были частью кэша последовательности, будет потеряна.Таким образом, если кэш изначально содержит числа 1-20, вы делаете nextval, который возвращает значение 1, и кэш устаревает из SGA, прежде чем вы снова вызовете nextval, вы ожидаете получить значение 21в следующий раз, когда вы позвоните nextval.

. Вы можете уменьшить частоту пробелов, уменьшив размер CACHE в последовательности до 1. Это не устранит пробелы - все еще будут, например, случаигде транзакция откатывается, например.И это снизит производительность.В общем, вам не следует беспокоиться о пробелах, поскольку генерируемые последовательностью первичные ключи по определению просто должны быть уникальными идентификаторами.

...