2012-02-24 2 views
2

вот мой problemI этого код, чтобы сделать переменную автоинкрементную в базе данных 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 .... Закройте программу, откройте ее снова, поэтому соединение базы данных оракула снова запущено. Я добавляю еще один вход, и у меня есть цифры, такие как 20,21,22,23 ... Я поместил программу на свой Android и подключился с другого устройства, когда я ввожу одного пользователя, у меня есть 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.

+0

Если вы совершаете каждую транзакцию, последовательность непрерывно увеличивается. Что с этим не так? – rics

ответ

2

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

create sequence test_seq 
start with 1 
increment by 1 
NOCACHE; 

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


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

+0

например, когда я добавляю одну строку из моего php-скрипта, все правильно, затем я перехожу к sql plus и вставляю одну строку, все идет хорошо. Но когда я хочу читать с моим php-скриптом все данные, я получаю только данные, вставленные с помощью php-скрипта ... Я проверю его немного больше вашего ответа о nocache. –

+0

. Я поставлю свой вопрос, чтобы вы могли видеть, что не так. –

3

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

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

+0

Я поставил комментарий @cagcowboy, но если вы это знаете, вы также можете ответить на него. –

+0

@denonth, вы не связали свой триггер и вашу процедуру, чтобы процесс ничего не сказал нам. Я склонен согласиться с редакцией кагоубоуба на его ответ. – Ben

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