Oracle PL / SQL序列未按预期使用对象构造函数递增

时间:2015-04-05 21:27:18

标签: sql oracle plsql

先谢谢大家。我遇到的问题是内置于对象构造函数中的PL / SQL序列没有按预期递增。

这是序列创建。

CREATE SEQUENCE base_t_s
START WITH 1
INCREMENT BY 1;
然后我在对象构造函数中增加它。 Base_t对象是super,其他所有对象都是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;

hobbit构造函数

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;

我创建了几个hobbits并且我获得了第一个增量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 个答案:

答案 0 :(得分:1)

Oracle序列不适用于在目标表中生成连续(递增一个)ID。这是因为它们被设计得非常快并且允许多线程访问,这意味着在引擎盖下,序列ID被缓存在不同的事务中。

您可以通过使用NOCACHE声明序列来缓解此问题,但如果由于某种原因导致事务回滚,则无法保证不会跳过ID。

一如既往,Tom Kyte explains this深入探讨。