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;
我想收到对此的评论,提前致谢...
实际要求是二级序列无间隙吗?如果是这样,那么您就遇到了巨大的序列化/可扩展性问题。
如果您需要提供一个供人类消费的无间隙序列,您可以使用实际序列(或时间戳,就此而言),正如 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)