Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PL/SQL序列没有使用对象构造函数按预期递增_Sql_Oracle_Plsql - Fatal编程技术网

Oracle 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

提前谢谢大家。我对构建在对象构造函数中的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.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语句,所以我忍不住认为它们应该正常运行。经过一些调试,结果证明您是对的。由于构造函数调用,序列在整个位置上跳跃。感谢所有的反馈。