Oracle PL / SQL序列未随对象构造函数的增加而增加

温斯托克

提前谢谢大家。我在对象构造函数中内置的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构造函数中,但这没有用。

任何帮助将不胜感激。

*请注意,由于构造函数调用,顺序是不可预测的。

米克助记符

Oracle序列并不意味着在目标表中产生连续的ID(递增1)。这是因为它们的设计速度非常快,并允许多线程访问,这意味着在后台,序列ID缓存在不同的事务中。

您可能可以通过使用声明序列来缓解问题NOCACHE,但是仍然不能保证如果出于某种原因回滚事务而不会跳过id。

与往常一样,汤姆·凯特(Tom Kyte)对此进行了深入的解释

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章