Oracle PL/SQL序列没有使用对象构造函数按预期递增
提前谢谢大家。我对构建在对象构造函数中的PL/SQL序列存在问题,该序列没有按预期递增 这是序列创建Oracle PL/SQL序列没有使用对象构造函数按预期递增,sql,oracle,plsql,Sql,Oracle,Plsql,提前谢谢大家。我对构建在对象构造函数中的PL/SQL序列存在问题,该序列没有按预期递增 这是序列创建 CREATE SEQUENCE base_t_s START WITH 1 INCREMENT BY 1; 然后在对象构造函数中递增它。基本对象是超级对象,所有其他对象都是基本对象的子对象 基本构造函数 CONSTRUCTOR FUNCTION base_t RETURN SELF AS RESULT IS BEGIN self.oid := base_t_s.NEXT
CREATE SEQUENCE base_t_s
START WITH 1
INCREMENT BY 1;
然后在对象构造函数中递增它。基本对象是超级对象,所有其他对象都是基本对象的子对象
基本构造函数
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;
霍比特构造器
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序列并不用于在目标表中生成连续(增量为1)ID。这是因为它们的设计非常快速,允许多线程访问,这意味着在后台,序列ID被缓存在不同的事务中 您可以通过使用
NOCACHE
声明序列来缓解此问题,但仍然不能保证在事务由于某种原因回滚时不会跳过ID
像往常一样,汤姆·基特深入研究。我尝试了
NOCACHE
,但没有成功。感谢您提供有关序列不可靠的信息。将来知道会很好。谢谢你的博客链接。我将不得不研究它。@VERNSTOKED,序列是非常可靠的,只要你只依赖它们做它们应该做的事情(生成唯一值)。我将需要继续调试我的代码。我不执行任何TCL语句,所以我忍不住认为它们应该正常运行。经过一些调试,结果证明您是对的。由于构造函数调用,序列在整个位置上跳跃。感谢所有的反馈。