Oracle 分区序列

Mac*_*per 3 sql database oracle

我正在尝试查看是否存在可以创建具有分区逻辑的序列的东西。我需要一个依赖于其他主键的序列号,例如:

id_person   sequence id
        1 | 1
        1 | 2
        2 | 1
        3 | 1
        1 | 3
Run Code Online (Sandbox Code Playgroud)

所以顺序必须取决于id_person分区。oracle上有类似的东西还是我必须自己在应用程序级别实现它?

谢谢。


您好,我们已经创建了这个 PLSQL 包,其中包含一个函数和过程:

PROCEDURE INIT_SEQUENCE(NAME varchar2, pkColumnNameList PARTITIONED_SEQUENCE_PK_COLUMN);
FUNCTION GET_NEXT_SEQUENCE_VALUE(NAME varchar2, pkPartitionColValue PARTITIONED_SEQUENCE_COL_VALUE) RETURN NUMBER;
Run Code Online (Sandbox Code Playgroud)

INIT_SEQUENCE - 输入要在序列中关联的名称以及列名称列表,这些列名称是固定序列的主键部分,例如:'ID_PERSON'

此过程的工作是创建将根据 pkColumnNameList 列管理序列增量的表。

GET_NEXT_SEQUENCE_VALUE - 获取要递增的序列名称和 pkColumnNameList 主键的值并进行下一步: 1) 动态创建要工作的 sql 2) dbms_lock.allocate_unique(); 锁定表 3) 检查表中是否存在记录以获取输入中的 pk 值 4) 如果存在记录,则在序列列中使用 max + 1 更新记录 5) 如果记录不存在,则插入新记录序列列中的 1 6) 返回新的 id;

我想收到对此的评论,提前致谢...

Ada*_*sch 5

实际要求是二级序列无间隙吗?如果是这样,那么您就遇到了巨大的序列化/可扩展性问题。

如果您需要提供一个供人类消费的无间隙序列,您可以使用实际序列(或时间戳,就此而言),正如 Nick Pierpont 建议的那样并保持可扩展性,您可以使用分析函数。

数据集(t1):

 ID_PERSON SEQUENCE_ID
---------- -----------
         1           1
         2           2
         3           3
         1           4
         1           5
         1           6
         2           7
         3           8
         1           9
Run Code Online (Sandbox Code Playgroud)

SQL:

select * 
  from 
  (select id_person, 
          sequence_id as orig_sequence_id,         
          rank () 
            over (partition by id_person 
                  order by sequence_id) 
            as new_sequence_id
     from t1
  )
 order by id_person, new_sequence_id;
Run Code Online (Sandbox Code Playgroud)

结果:

ID_PERSON  ORIG_SEQUENCE_ID NEW_SEQUENCE_ID
---------- ---------------- ---------------
         1                1               1
         1                4               2
         1                5               3
         1                6               4
         1                9               5
         2                2               1
         2                7               2
         3                3               1
         3                8               2
Run Code Online (Sandbox Code Playgroud)

  • @Stephanie Page:引入序列化的设计无法扩展。无论它是一个玩具应用程序,还是最终,序列化都会影响使用“select max(column) + 1”“模式”的设计。一开始就不引入序列化要容易得多。 (2认同)