Dúvidas e procedimentos do dia a dia de um DBA. Desde anotações bem simples até procedimentos complexos.
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
Assinar:
Postar comentários (Atom)
Montei uma alternativa em que o usuário nem precisa saber os valores, o script pega e utiliza variáveis para atualizar.
ResponderExcluirDECLARE
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;
Complementando:
Excluir--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