每月重置Oracle序列的最佳策略
我正在寻找最佳策略来重置用于生成唯一密钥的序列。这些键是使用前缀值生成的,前缀值也是由月值和年值的组合生成的,如以下示例所示: 2020060100000001年4个月2个月序列8d 序列值必须在每个新月份的第一秒重新启动 是否存在允许在此情况下调用函数或过程来执行此任务的Oracle事件 有人能帮我提供意见和经验吗 非常感谢!每月重置Oracle序列的最佳策略,oracle,sequence,reset,Oracle,Sequence,Reset,我正在寻找最佳策略来重置用于生成唯一密钥的序列。这些键是使用前缀值生成的,前缀值也是由月值和年值的组合生成的,如以下示例所示: 2020060100000001年4个月2个月序列8d 序列值必须在每个新月份的第一秒重新启动 是否存在允许在此情况下调用函数或过程来执行此任务的Oracle事件 有人能帮我提供意见和经验吗 非常感谢! Rodrigo每月重置序列不是有效的方法。基本上,您违反了序列的使用。从你的问题我可以理解,你想在你的专栏后面加上年份和月份。在这种情况下,可以在插入时进行简单的连接
Rodrigo每月重置序列不是有效的方法。基本上,您违反了序列的使用。从你的问题我可以理解,你想在你的专栏后面加上年份和月份。在这种情况下,可以在插入时进行简单的连接
year||month||sequence_name.nextval
Eg: 2020||02||sequence_name.nextval
如果仍要重置,可以创建触发器每月重置序列,如果确实要设置序列值,可以使用以下方法:
PROCEDURE SET_SEQUENCE(pinSequence_owner IN VARCHAR2,
pinSequence_name IN VARCHAR2,
pinNew_next_value IN NUMBER,
pinDebug IN BOOLEAN := FALSE)
IS
strSQL VARCHAR2(4000);
nNext_number NUMBER;
nOriginal_increment NUMBER;
nNew_nextval NUMBER;
nNew_last_number NUMBER;
BEGIN
strSQL := 'SELECT s.LAST_NUMBER, INCREMENT_BY ' ||
'FROM DBA_SEQUENCES s ' ||
'WHERE s.SEQUENCE_OWNER = ''' || pinSequence_owner || ''' AND ' ||
's.SEQUENCE_NAME = ''' || pinSequence_name || '''';
EXECUTE IMMEDIATE strSQL INTO nNext_number, nOriginal_increment;
-- Note that DBA_SEQUENCES.LAST_NUMBER represents the *next* number which will be
-- returned by a call to NEXTVAL.
IF pinNew_next_value NOT IN (nNext_number-1, nNext_number)
THEN
strSQL := 'ALTER SEQUENCE ' || pinSequence_owner || '.' || pinSequence_name ||
' INCREMENT BY ' || TO_CHAR(pinNew_next_value - nNext_number) || ' NOCACHE';
EXECUTE IMMEDIATE strSQL;
strSQL := 'SELECT ' || pinSequence_owner || '.' || pinSequence_name || '.NEXTVAL FROM DUAL';
EXECUTE IMMEDIATE strSQL INTO nNew_nextval;
strSQL := 'ALTER SEQUENCE ' || pinSequence_owner || '.' || pinSequence_name ||
' INCREMENT BY ' || nOriginal_increment || ' NOCACHE';
EXECUTE IMMEDIATE strSQL;
strSQL := 'SELECT s.LAST_NUMBER FROM DBA_SEQUENCES s WHERE s.SEQUENCE_OWNER = ''' || pinSequence_owner ||
''' AND s.SEQUENCE_NAME = ''' || pinSequence_name || '''';
EXECUTE IMMEDIATE strSQL INTO nNew_last_number;
END IF;
END SET_SEQUENCE;
这是oracle序列通常要做的事情之一。您可以创建一个按所需时间间隔运行的计划作业,然后删除/重新创建,或者在此处使用触发器重置它?是什么事件导致了上述触发器触发?不,这将是一个计划作业,而不是触发器。可以将触发器设置为在Oracle中针对Sysdate执行。它不需要任何调度过程。您能给我指一下文档吗?我没有在12.1 PL/SQL语言参考中找到它。