gpt4 book ai didi

sql - Oracle 分区序列

转载 作者:搜寻专家 更新时间:2023-10-30 20:13:25 26 4
gpt4 key购买 nike

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

id_person   sequence id
1 | 1
1 | 2
2 | 1
3 | 1
1 | 3

因此序列必须取决于 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;

INIT_SEQUENCE - 输入要在序列中关联的名称和列名称列表,这些名称是固定主键部分,用于标记序列 Ex:'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

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;

结果:

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

关于sql - Oracle 分区序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2265401/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com