Deletando sequencia não utilizada

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
AlexTR
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 48
Registrado em: Seg, 25 Jun 2012 3:30 pm

Bom sou novo no forum.

Bom criei uma sequencia para os ID so que quando deletados os dados que usuario digitou a seguencia continua, esse exemplo é no forms com as tabelas e tudo já criado:
ID:1
Nome: Alex
Telefone: 111111

outro dado:


ID:2
Nome: Rafael
Telefone: 1112111

depois deletaram o primeiro dado o ID: 1 mais a seguencia continua no 3 e não volta para o 1 como faço isso?

vo colocar minha procedure aqui que da a sequencia para os IDs:

Selecionar tudo

create or replace
FUNCTION FUNC_GERA_SEQ_PRODUTO RETURN NUMBER AS 
 VN_CODIGO NUMBER;
 VN_AUX    NUMBER;
BEGIN
  LOOP 
   ----------------------------------------------------------------------------------------------------------
   ---## Gerar o Sequencial Automático de Banco ## ---------------------------------------------------------
   ---------------------------------------------------------------------------------------------------------
    BEGIN
     SELECT SEQ_ID_PROD.nextval
        INTO VN_CODIGO
     FROM DUAL;
    EXCEPTION WHEN OTHERS THEN
      RAISE_APPLICATION_ERROR(-20001,'Problema ao tentar gerar o código do Produto!'||CHR(10)||
                                     'FUNC_GERA_SEQ_PRODUTO'||CHR(10)||
                                     'Erro: '||SQLERRM
                             );
    END;
    ----- ## END - Gerar o Sequencial Automático de Banco ## ------------------------------------------------
    
    ---------------------------------------------------------------------------------------------------------
    ---## Verificar se o código gerado já está em uso. Caso verdadeiro gerar um novo código automático ## ---
    ---## Repetir a Operação de validação de código gerado até encontrar um código não utilizado ## ---------
    ---------------------------------------------------------------------------------------------------------
    BEGIN
     
     SELECT COUNT(*)
        INTO VN_AUX
     FROM PRODUTO
     WHERE ID_PRODUTO = VN_CODIGO;
     
     IF VN_AUX = 0 THEN
      EXIT;
     END IF;
    EXCEPTION WHEN OTHERS THEN
      RAISE_APPLICATION_ERROR(-20001,'Problema ao tentar validar o código do Produto!'||CHR(10)||
                                     'FUNC_GERA_SEQ_PRODUTO'||CHR(10)||
                                     'Erro: '||SQLERRM
                             );
    
    END;
    ---## END - Verificar se o código gerado já está em uso. Caso verdadeiro gerar um novo código automático ## ---
   END LOOP;  
  
  RETURN VN_CODIGO;

END FUNC_GERA_SEQ_PRODUTO;

Obrigado pelo atenção. :shock:
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Primeiramente, seja bem vindo.
Segundamente* você não entendeu bem o conceito de sequence.
Utiliza-se sequences geralmente para criar os IDs de processos/tabelas, podendo ter um trabalho maior em cima desse número, procedimento do que ao utilizar , como no mysql, a opção auto-increment.
A sequence SEMPRE vai ficar aumentando conforme incremento. Existe a sequence cíclica mas não é controlável ao bel prazer.
Uma forma de "resetá-la" seria DROPar ela e recriar novamente.
No seu caso um contador bastaria dentro do seu Loop.
Seu LOOP também está sem condição alguma de parada. A única forma que para é entrando num a exceção.
Controle direito isso, coloque um contador, para poder rsetar os dados.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá AlexTR,

As SEQUENCES no ORACLE correspondem a CONTADORES, que aumentam ou diminuem de valor (depende de como foi criada a mesma), conforme se executa um comando <NOME_SEQUENCIA>.NEXTVAL;

Uma vez disparado o comando NEXTVAL, a sequence é atualizada em seu valor e não pode mais voltar ao valor anterior. Não existem comandos para retroceceder o valor da sequence.

Não sei se você está fazendo esta pergunta porque deseja que TODOS os valores da sua sequence sejam aproveitados na tabela. Só gostaria de lhe informar que é impossível que não ocorram GAPs nos valores gerados pelas sequências.

Existe uma série de fatores que podem fazer com que o valor de uma sequence "seja perdido" durante a transação de banco de dados (ex: queda de banco, estouro de tablespace, etc). Isso criará "GAPs" (intervalos) nas sequencias.

Por isso, pense realmente se deseja retroceder o valor de sua sequência. Com sequences, não será possível garantir que todos os valores lidos com NEXTVAL sejam aproveitados em suas tabelas.

Se desejar realmente alterar a sequence, existem algumas manutenções que são permitidas pelo comando ALTER SEQUENCE.

Maiores detalhes podem ser obtidos no link abaixo:

Dicas sobre ALTER SEQUENCE : http://docs.oracle.com/cd/B19306_01/ser ... s_2011.htm
Gambiarra para resetar sequence (ASKTOM): http://asktom.oracle.com/pls/asktom/f?p ... 9633817597

Abraços,

Sergio Coutinho
AlexTR
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 48
Registrado em: Seg, 25 Jun 2012 3:30 pm

Muito obrigado na verdade os IDs ficaram invisiveis para o usuario, meu objetivo era que o usuario não precisa-se ficar colocando um ID(primary key) toda hora que fose cadastrar algo novo, eu so perguntei se teria como para deixar mais organizado, porem me ajudaram muito a entender melhor a sequencia e como tomar cuidado com ela, fico realmente grato.

gostaria de deixar uma observação, estou muito feliz em encontrar um forum de oracle do Brasil, era uma extrema dificuldade entender os gringos com mesmo erro que o meu e muitas vezes, isso dava dor de cabeça obrigado xD :D
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá AlexTR,

Suas dúvidas sempre serão bem vindas, bem como as suas eventuais contribuições dentro dos forums do GLUFKE.

E muito obrigado pelas observações.

Creio que elas são um incentivo a todos os foristas que participam e mantém o GLUFKE.

Abraços,

Sergio Coutinho
arthae
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Seg, 09 Mai 2011 1:13 pm
Localização: Porto Alegre - RS
GIVE ME COFFEE AND NO ONE GETS HURT!

é possivel saber o numero de uma sequencia não utilizado com as funções lead e lag
onde uma consegue ver o proximo registro e a outra vê o registro anterior
então é só ver se o proximo é maior do que o anterior +1!

algo +/- assim

Selecionar tudo

select id_corrente
     , posterior
     , posterior - id_corrente - 1 intervalo
     , id_corrente + 1 proximo
  from ( select id id_corrente
              , Lead( id, 1, 0 ) over ( order by id ) posterior
           from teste )
 where posterior - id_corrente > 1;
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 18 visitantes