sql - Oracle PL/SQL 序列未按对象构造函数的预期递增

标签 sql oracle plsql

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

这是序列创建。

CREATE SEQUENCE base_t_s
START WITH 1
INCREMENT BY 1;

然后我在对象构造函数中增加它。 Base_t 对象是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。这是因为它们被设计得非常快并且允许多线程访问,这意味着在幕后,序列 ID 缓存在不同的事务中。

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

一如既往,汤姆·凯特 explains this深入。

关于sql - Oracle PL/SQL 序列未按对象构造函数的预期递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29462419/

相关文章:

C# 从 SQL DataTable 填充组合框

oracle - SQL Fiddle 输出错误

php - 使用 putty.exe 创建过程

sql - 在每个组的 n 行到 n 行之间进行选择

用于查找其他表中不存在的行的 SQL 查询

html - 此方法的 Oracle PL/SQL 等效项是什么?

java - 结果集 - 游标 : rs. next() 花费大量时间

plsql - PL-SQL 中的 WITH 子句

java - 尝试使用 Java 运行 PL/SQL 脚本

mysql - 根据时间戳获取本周更改的所有行