Oracle PL/SQL 序列未按预期使用对象构造函数递增
Oracle PL/SQL Sequence not incrementing as expected with object constructors
在此先感谢大家。我在对象构造函数中内置的 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 序列不适用于在目标 table 中生成连续的(递增一个)ID。这是因为它们被设计得非常快并且允许多线程访问,这意味着在幕后,序列 ID 被缓存在不同的事务中。
您可以通过使用 NOCACHE
声明序列来缓解该问题,但仍然不能保证如果由于某种原因事务要回滚,id 不会被跳过。
一如既往,Tom Kyte explains this 深入。
在此先感谢大家。我在对象构造函数中内置的 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 序列不适用于在目标 table 中生成连续的(递增一个)ID。这是因为它们被设计得非常快并且允许多线程访问,这意味着在幕后,序列 ID 被缓存在不同的事务中。
您可以通过使用 NOCACHE
声明序列来缓解该问题,但仍然不能保证如果由于某种原因事务要回滚,id 不会被跳过。
一如既往,Tom Kyte explains this 深入。