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

问题描述 投票:0回答:2

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

2020060100000001-年(4d)月(2d)序列(8d)

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

在这种情况下是否有任何Oracle事件允许基于此函数或过程的调用来完成这项工作?

有人可以帮助我提供意见和经验吗?

非常感谢!罗德里戈

oracle sequence reset
2个回答
0
投票

每月重置顺序不是有效的方法。基本上,您违反了序列的使用。从您能理解的问题来看,您想将年份和月份添加到您的列中。在这种情况下,您可以在插入时简单地串联,

year||month||sequence_name.nextval

Eg: 2020||02||sequence_name.nextval

如果您仍然想重置,则可以创建一个触发器以每月重置该序列,


0
投票

如果您确实要设置序列的值,则可以使用如下所示的内容:

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;
© www.soinside.com 2019 - 2024. All rights reserved.