Páginas

quarta-feira, 3 de abril de 2013

Oracle - Sequences - atualizando valores


Procedimento para atualizar uma sequence que está com valores desatualizados:

-- Pegar valor da sequence
select seq_audit_log.nextval from dual; --190382

-- Pegar valor do máximo campo da tabela onde a aplicação usa a sequence
select max(idt_audit_log) - 190382 from audit_log;

-- Alterar incremento e atualizar sequence
alter sequence SEQ_AUDIT_LOG increment by 741;
select SEQ_AUDIT_LOG.nextval from dual;
alter sequence SEQ_AUDIT_LOG increment by 1;
select seq_audit_log.currval from dual; --191123

2 comentários:

  1. Montei uma alternativa em que o usuário nem precisa saber os valores, o script pega e utiliza variáveis para atualizar.

    DECLARE
    actual_sequence_number
    INTEGER;
    max_number_from_table
    INTEGER;
    difference
    INTEGER;
    BEGIN
    SELECT SQ_CD_TP_TAXA_SERV.CURRVAL INTO actual_sequence_number FROM DUAL;
    SELECT MAX(CD_TP_tAXA_SERV) INTO max_number_from_table FROM SIGA_TIPO_TAXA_SERVICO;
    SELECT (max_number_from_table-actual_sequence_number)+1 INTO difference FROM DUAL;
    --DBMS_OUTPUT.put_line (actual_sequence_number);
    --DBMS_OUTPUT.put_line (CONCAT('alter sequence sq_cd_tp_taxa_serv increment by ', difference));
    EXECUTE IMMEDIATE CONCAT('alter sequence sq_cd_tp_taxa_serv increment by ', difference);
    END;

    ResponderExcluir
    Respostas
    1. Complementando:

      --aqui ele puxa o próximo valor usando o incremento necessário
      select sq_cd_tp_taca_serv.nextval

      --aqui volta o incremento para 1, para que futuras inserções funcionem normalmente
      alter sequence sq_cd_tp_taxa_serv increment by 1

      Excluir