Oracle 每月新序列:从零开始(oracle每月第一天)
Oracle数据库使用序列作为标准对象,用于生成唯一值。序列可以使唯一值与其他数据行在不同行之间区分开来,从而避免主键冲突,这一概念在一定程度上类似于一个没有重复值的“无限”数列。 Oracle 允许为数据库中的每一行创建一个单独的序列,以满足不同表的主键需求。
为了方便起见,Oracle 提供了一种方式来每月创建新的序列,这样的新的序列可以在每月的第一天从零开始,这样可以更容易管理序列值,防止主键冲突。
要创建一个每月新序列,需要做以下几步:
1、首先,在数据库中创建一个新的序列;
例如:
CREATE SEQUENCE TEST_SEQ
START WITH 0
–每月重新从0开始
INCREMENT BY 1
–每次递增1
CACHE 20
–缓存的最大值
CYCLE;
–循环使用已缓存的序列
2、然后,创建一个存储过程,用于在每个月的1号重置缓存;
例如:
CREATE OR REPLACE PROCEDURE PR_SEQ_RESET
AS
BEGIN
EXECUTE IMMEDIATE ‘alter sequence test_seq increment by -20 nocycle’;
EXECUTE IMMEDIATE ‘alter sequence test_seq increment by 1 cycle’;
END;
/
3、最后,创建一个定时任务,让存储过程在每个月1号执行;
例如:
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => ‘reset_seq’,
job_type => ‘PLSQL_BLOCK’,
job_action => ‘BEGIN PR_SEQ_RESET; END;’,
start_date => SYSTIMESTAMP,
repeat_interval => ‘FREQ=MONTHLY;BYMONTHDAY=1;BYHOUR=0;BYMINUTE=0;BYSECOND=0’,
end_date => NULL,
enabled => TRUE,
comments => ‘Reset sequence to 0’);
END;
/
以上步骤完成后,每月的第一天序列将从零开始,确保序列值的唯一性,避免数据表主键冲突。