автоинкремент оракула с последовательностью и триггером работает неправильно - PullRequest
3 голосов
/ 24 февраля 2012

вот моя проблема, у меня есть этот код для создания автоинкрементной переменной в базе данных oracle:

CREATE TABLE Korisnici
    (
        id_korisnika number PRIMARY KEY,
        ime_korisnika varchar2(200),
        prezime_korisnika varchar2(200),
        broj_telefona varchar2(30),
        adresa_korisnika varchar2(400)
    )
    /

create sequence test_seq
start with 1 
increment by 1;

CREATE OR REPLACE TRIGGER test_trigger
BEFORE INSERT ON Korisnici FOR EACH ROW
BEGIN
  SELECT test_seq.NEXTVAL
  INTO :NEW.id_korisnika
  FROM DUAL;
END;
/

Если я начну с начала, все работает отлично, у меня есть числа как 1,2,3,4 .... Я закрываю программу, открываю ее снова, чтобы снова установить соединение с базой данных oracle. Я добавляю еще один вход, и у меня есть номера, как 20,21,22,23 ... Я ставлю программу на свой андроид и подключаюсь с другого устройства, при вводе одного пользователя у меня 30,31,33,34 ...

Почему это происходит? И как это исправить?

Спасибо

EDIT:

Вот мой процесс для чтения данных из базы данных

CREATE OR REPLACE PROCEDURE Citanje_korisnika( p_rc OUT SYS_REFCURSOR )
AS
BEGIN
  OPEN p_rc
   FOR SELECT *
         FROM Korisnici;
END;

Я новичок в базе данных Oracle.

Ответы [ 2 ]

3 голосов
/ 24 февраля 2012

Это не проблема. Вы, вероятно, указали cache 10 в своем скрипте создания последовательности. Если вы измените это значение на nocache, это поможет с пропусками, за счет снижения производительности, но они никогда не исчезнут полностью, так как любые откаты сделаны, а убитые вставки и т. Д. Будут использовать значения. Пожалуйста, смотрите этот вопрос Tom Tom .

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

3 голосов
/ 24 февраля 2012

Задание SEQUENCE с помощью NOCACHE остановит сеанс, кэширующий по 20 чисел за раз, и поможет.

create sequence test_seq
start with 1 
increment by 1
NOCACHE;

Однако, если вы надеетесь на полностью непрерывную последовательность, это очень трудно достичь - числавзятые из последовательности «потеряны», если (например) вставка откатывается.


Исходя из вашего комментария, мне интересно, если вы забыли COMMIT?

...