每月重置Oracle序列的最佳策略

每月重置Oracle序列的最佳策略,oracle,sequence,reset,Oracle,Sequence,Reset,我正在寻找最佳策略来重置用于生成唯一密钥的序列。这些键是使用前缀值生成的,前缀值也是由月值和年值的组合生成的,如以下示例所示: 2020060100000001年4个月2个月序列8d 序列值必须在每个新月份的第一秒重新启动 是否存在允许在此情况下调用函数或过程来执行此任务的Oracle事件 有人能帮我提供意见和经验吗 非常感谢! Rodrigo每月重置序列不是有效的方法。基本上,您违反了序列的使用。从你的问题我可以理解,你想在你的专栏后面加上年份和月份。在这种情况下,可以在插入时进行简单的连接

我正在寻找最佳策略来重置用于生成唯一密钥的序列。这些键是使用前缀值生成的,前缀值也是由月值和年值的组合生成的,如以下示例所示:

2020060100000001年4个月2个月序列8d

序列值必须在每个新月份的第一秒重新启动

是否存在允许在此情况下调用函数或过程来执行此任务的Oracle事件

有人能帮我提供意见和经验吗

非常感谢!
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语言参考中找到它。