2015-04-05 3 views
1

Спасибо за все. У меня возникают проблемы с последовательностью PL/SQL, которая встроена в конструкторы объектов, которые не увеличиваются, как ожидалось.Oracle PL/SQL Последовательность не увеличивается, как ожидалось, с конструкторами объектов

Это создание последовательности.

CREATE SEQUENCE base_t_s 
START WITH 1 
INCREMENT BY 1; 

Затем я увеличиваю его внутри объектов-конструкторов. Объект Base_t - супер, а все остальные - дочерний объект base_t.

base_t конструктор

CONSTRUCTOR FUNCTION base_t RETURN SELF AS RESULT IS 
    BEGIN 
     self.oid := base_t_s.NEXTVAL; -- Create oid using the base_t_s sequence. 
     self.name := 'BASE_T';  -- Name the oname as the object type. 
     self.oname := 'BASE_T'; 
     RETURN; 
    END base_t; 

хоббит конструктор

CONSTRUCTOR FUNCTION hobbit (a_name VARCHAR2) RETURN SELF AS RESULT IS 
    BEGIN 
/* Assign a sequence value and string literal to the instance. */ 
     self.oid := base_t_s.NEXTVAL; 
     self.oname := 'HOBBIT'; 
     self.genus := 'HOBBITS'; 
/* Assign a parameter to the subtype only attribute. */ 
     self.name := a_name; 
     RETURN; 
    END; 

создать несколько хоббиты, и я получаю первое приращение 3, то каждое приращение затем есть на 16. Этот пример является с карликами, но это то же самое для каждого объекта.

Это выход. Я создал эти объекты только в том порядке, в котором они находятся.

DWARF(3, 'Thorin Oakenshield', 'DWARF', 'DWARVES') 
DWARF(19, 'Thorin Oakenshield', 'DWARF', 'DWARVES') 
DWARF(35, 'Thorin Oakenshield', 'DWARF', 'DWARVES') 
DWARF(51, 'Thorin Oakenshield', 'DWARF', 'DWARVES') 

Я бросаю последовательность перед каждым прогоном. Я попытался только поместить base_t_s.NEXTVAL в конструктор base_t, но это не сработало.

Любая помощь была бы принята с благодарностью.

* Обратите внимание, что последовательность событий непредсказуема из-за вызовов конструктора.

ответ

1

Последовательности Oracle не предназначены для создания непрерывных (приращений на единицу) идентификаторов в целевой таблице. Это связано с тем, что они разработаны очень быстро и позволяют многопоточный доступ, а это значит, что под капотом идентификаторы последовательностей кэшируются в разных транзакциях.

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

Как всегда, Tom Kyte explains this в глубину.

+0

Я пробовал 'NOCACHE' без успеха. Спасибо, что информация о последовательности не является надежной. Будет хорошо знать в будущем. Спасибо, что связали блог. Мне нужно будет это изучить. – VERNSTOKED

+0

@VERNSTOKED, последовательности чрезвычайно надежны, если вы полагаетесь только на то, что они делают то, что они должны делать (генерируют уникальные значения). –

+0

Мне нужно будет продолжить отладку моего кода. Я не выполняю никаких заявлений TCL, поэтому я не могу не думать, что они должны действовать нормально. – VERNSTOKED

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