Oracle 如何在年终的最后一天自动重置序列号?

Oracle 如何在年终的最后一天自动重置序列号?,oracle,Oracle,是否有可能每年自动重置序列号?例如,12月31日的序列是3465,1月1日的序列应该是0001 现在我通过下面的查询手动重置它 select p_seq_name.nextval from dual; alter sequence p_seq_name increment by -3465 minvalue 0; select p_seq_name.nextval from dual; alter sequence p_seq_name increment by 1 minvalue 0; 谢

是否有可能每年自动重置序列号?例如,12月31日的序列是3465,1月1日的序列应该是0001

现在我通过下面的查询手动重置它

select p_seq_name.nextval from dual;
alter sequence p_seq_name increment by -3465 minvalue 0;
select p_seq_name.nextval from dual;
alter sequence p_seq_name increment by 1 minvalue 0;

谢谢

首先,您必须创建一个包含您提到的SQL的过程。然后,您必须创建一个计划作业,该作业将执行该过程,并且该作业将每年运行一次

CREATE OR REPLACE PROCEDURE RESET_SEQUENCE
IS
v_next_value number;
v_sequence_name varchar2(100):='SEQUENCE01';
begin
    execute immediate   'select ' || v_sequence_name || '.nextval from dual' INTO v_next_value;
    execute immediate   'alter sequence ' || v_sequence_name || ' increment by -' || v_next_value || ' minvalue 0';
    execute immediate  'select ' || v_sequence_name || '.nextval from dual' INTO v_next_value;
    execute immediate  'alter sequence ' || v_sequence_name || ' increment by 1 minvalue 0';
END RESET_SEQUENCE;
/



BEGIN
  SYS.DBMS_SCHEDULER.CREATE_JOB
    (
       job_name        => 'RESET_SEQ_YEARLY'
      ,start_date      => TO_TIMESTAMP_TZ('2016/01/01 10:20:41.299669 Asia/Dacca','yyyy/mm/dd hh24:mi:ss.ff tzr')
      ,repeat_interval => 'FREQ=YEARLY;BYMONTH=DEC; BYMONTHDAY=31;BYHOUR=23;BYMINUTE=59;BYSECOND=59'
      ,end_date        => NULL
      ,job_class       => 'DEFAULT_JOB_CLASS'
      ,job_type        => 'PLSQL_BLOCK'
      ,job_action      => 'begin
                                    RESET_SEQUENCE;
                                    end;'
      ,comments        => 'Last day of the year'
    );
   SYS.DBMS_SCHEDULER.ENABLE
    (name                  => 'RESET_SEQ_YEARLY');
END;
/

首先,您必须创建一个包含您提到的SQL的过程。然后,您必须创建一个计划作业,该作业将执行该过程,并且该作业将每年运行一次

CREATE OR REPLACE PROCEDURE RESET_SEQUENCE
IS
v_next_value number;
v_sequence_name varchar2(100):='SEQUENCE01';
begin
    execute immediate   'select ' || v_sequence_name || '.nextval from dual' INTO v_next_value;
    execute immediate   'alter sequence ' || v_sequence_name || ' increment by -' || v_next_value || ' minvalue 0';
    execute immediate  'select ' || v_sequence_name || '.nextval from dual' INTO v_next_value;
    execute immediate  'alter sequence ' || v_sequence_name || ' increment by 1 minvalue 0';
END RESET_SEQUENCE;
/



BEGIN
  SYS.DBMS_SCHEDULER.CREATE_JOB
    (
       job_name        => 'RESET_SEQ_YEARLY'
      ,start_date      => TO_TIMESTAMP_TZ('2016/01/01 10:20:41.299669 Asia/Dacca','yyyy/mm/dd hh24:mi:ss.ff tzr')
      ,repeat_interval => 'FREQ=YEARLY;BYMONTH=DEC; BYMONTHDAY=31;BYHOUR=23;BYMINUTE=59;BYSECOND=59'
      ,end_date        => NULL
      ,job_class       => 'DEFAULT_JOB_CLASS'
      ,job_type        => 'PLSQL_BLOCK'
      ,job_action      => 'begin
                                    RESET_SEQUENCE;
                                    end;'
      ,comments        => 'Last day of the year'
    );
   SYS.DBMS_SCHEDULER.ENABLE
    (name                  => 'RESET_SEQ_YEARLY');
END;
/

您可以创建如下所示的计划程序作业:

BEGIN
  DBMS_SCHEDULER.CREATE_JOB
    (
       job_name        => 'RESET_SEQUENCE'
      ,repeat_interval => 'FREQ=YEARLY;INTERVAL=1;BYMONTH=1;BYMONTHDAY=1;BYHOUR=0;BYMINUTE=0'
      ,job_class       => 'DEFAULT_JOB_CLASS'
      ,job_type        => 'PLSQL_BLOCK'
      ,job_action      => 'BEGIN EXECUTE IMMEDIATE ''ALTER SEQUENCE p_seq_name INCREMENT BY -3465 MINVALUE 0''; END;'
        ,enabled         => TRUE;
    );
END;
/
此作业将在每年1月1日午夜后运行。 为了在12月31日运行,请使用重复间隔,如


FREQ=每年一次;间隔=1;按月=12;BYMONTHDAY=31;按小时=23;BYMINUTE=59

您可以创建如下调度程序作业:

BEGIN
  DBMS_SCHEDULER.CREATE_JOB
    (
       job_name        => 'RESET_SEQUENCE'
      ,repeat_interval => 'FREQ=YEARLY;INTERVAL=1;BYMONTH=1;BYMONTHDAY=1;BYHOUR=0;BYMINUTE=0'
      ,job_class       => 'DEFAULT_JOB_CLASS'
      ,job_type        => 'PLSQL_BLOCK'
      ,job_action      => 'BEGIN EXECUTE IMMEDIATE ''ALTER SEQUENCE p_seq_name INCREMENT BY -3465 MINVALUE 0''; END;'
        ,enabled         => TRUE;
    );
END;
/
此作业将在每年1月1日午夜后运行。 为了在12月31日运行,请使用重复间隔,如


FREQ=每年一次;间隔=1;按月=12;BYMONTHDAY=31;按小时=23;BYMINUTE=59

您可以使用脚本创建作业。您将需要动态SQL来更改sequence@Tatiana你能给我举个例子吗?你用这个序列做什么?要生成复合键的“子键”(类似于
{YEAR,ID}
)吗?如果是这样,也许你可以考虑使用<代码>选择max(ID)+ 1…其中YEAR=…和
在循环中插入
,而不是顺序。您使用的是什么版本的Oracle?12c中的语法稍微简单一些。您可以使用脚本创建作业。您将需要动态SQL来更改sequence@Tatiana你能给我举个例子吗?你用这个序列做什么?要生成复合键的“子键”(类似于
{YEAR,ID}
)吗?如果是这样,也许你可以考虑使用<代码>选择max(ID)+ 1…其中YEAR=…和
在循环中插入
,而不是顺序。您使用的是什么版本的Oracle?12c中的语法稍微简单一些。您能否帮助将异常添加到过程中。它给了我编译错误现在你可以创建没有编译错误的过程。你能帮我把异常添加到过程中吗。它给了我编译错误现在你可以创建没有编译错误的过程了。