Como fazer para não perder numeros no Auto incremento

14/04/2010

0

Ola para todos e obrigado desde de ja.   Meu problema é que, usando serial ou nextval() para auto incremento no postgresql, sempre que ocorre uma exception, e o cadastro não é feito, o sequencial avança e o numero é perdido, isso deixa muitos buracos no sequencia dos codigos.   Ai minha duvida é, se alguem sabe como fazer para não permitir que ele avançe o sequencial caso ocorra uma exception.   Como fazer para que o sequencia permaneça inalterado ate que o registro realmente tenha condições de ser gravado?   Obrigado e ate mais   Luciano Barcelos
Luciano Barcelos

Luciano Barcelos

Responder

Posts

14/04/2010

Luciano Barcelos

Obrigado a todos, mas ja resolvi o problema, agora so muda o valor quando realmente é insertado o registro no banco.   Ate+
Responder

14/04/2010

Luciano Barcelos

E ai pessoal.   Olha so, so ta faltando um detalhe para ficar blz o meu problema abaixo.   Preciso colocar um determinado sequence na sesao sem utilizar o nextval().   Alguem sabe como posso fazer isso?   Obrigado Luciano Barcelos
Responder

09/06/2010

Saulo Benvenutti

Não sei se eu entendi o seu proble direito , mas vamos lá ... o firebird tem um controlador bem bacana de sequenciadores ... e como eu vim do firebird, ou melhor, migrei uma base firebird para postgres, e não queria alterar muito o código da aplicação resolvi construir no postgreSQL a mesma função de controle ... a única diferença na verdade é que o sequenciador precisa estar com aspas (text) ... inclusive é possível pegar o valor atual sem ter que utilizar um nextval primeiro ... 
para usar é igual no firebird ... gen_id('sequenciador',incremento);ou seja valores negativos decrementam, zero pega o valor atual e positivo aumenta ... sempre com retorno...

CREATE OR REPLACE FUNCTION gen_id(generator information_schema.sql_identifier, operador integer)  RETURNS bigint AS$BODY$DECLARE  retorno bigint;BEGIN
   EXECUTE  'SELECT last_value from '||generator into retorno;
 if operador <> 0 THEN   retorno = retorno + operador;   EXECUTE  'SELECT setval('||quote_literal(generator)||','||retorno||')' ;   EXECUTE  'SELECT last_value from '||generator into retorno; end if; 
 return retorno;   END;$BODY$  LANGUAGE 'plpgsql' STABLE SECURITY DEFINER  COST 100;ALTER FUNCTION grupo.gen_id(information_schema.sql_identifier, integer) OWNER TO postgres;
COMMENT ON FUNCTION gen_id(information_schema.sql_identifier, integer) IS 'Função para dar compatibilidade com os generators do Firebird Autor: Saulo José Benvenutti '; 
Responder

17/06/2012

Maria Elizandra

Olá!! Será que vc poderia descrever como vc fez para resolver o problema "Não perder Numeros no Auto Incremento do postgresql?".
Estou com esse mesmo problema...estou usando Adotable e AdoDataSet...

Obrigda
Responder

18/06/2012

Jair N.

Evitando o problema utilizando o campo como inteiro.
Exemplo: Tabela seguros (int_cod_seguros INTEGER NOT NULL DEFAULT nextval(seq_adm_seguros::regclass),
O valor default é sequenciallizado pelo:
SEQUENCE seq_cml_seguros INCREMENT 1 MINVALUE 0 NO MAXVALUE START 0 CACHE 1;

Mas caso o seqüêncial pule eu uso a função:

CREATE OR REPLACE FUNCTION func_int_intervalo(tabela VARCHAR, campo VARCHAR)
RETURNS INTEGER AS
$BODY$
DECLARE
intRetorno INTEGER DEFAULT 0;
recSQL RECORD;
curSQL REFCURSOR;
BEGIN

OPEN curSQL FOR EXECUTE SELECT COALESCE(|| Campo ||,1) AS int_cod_atual FROM || Tabela || ORDER BY || Campo;
LOOP
FETCH curSQL INTO recSQL;
intRetorno = intRetorno + 1;

IF (intRetorno recSQL.int_cod_atual) OR (recSQL.int_cod_atual IS NULL) THEN
RETURN intRetorno;
CLOSE curSQL;
EXIT;
END IF;

END LOOP;
CLOSE curSQL;

RETURN intRetorno;
END;
$BODY$
LANGUAGE plpgsql;


Ola para todos e obrigado desde de ja.
 
Meu problema é que, usando serial ou nextval() para auto incremento no postgresql, sempre que ocorre uma exception, e o cadastro não é feito, o sequencial avança e o numero é perdido, isso deixa muitos buracos no sequencia dos codigos.
 
Ai minha duvida é, se alguem sabe como fazer para não permitir que ele avançe o sequencial caso ocorra uma exception.
 
Como fazer para que o sequencia permaneça inalterado ate que o registro realmente tenha condições de ser gravado?
 
Obrigado e ate mais
 
Luciano Barcelos
Responder

03/07/2012

Bill Cabral

Pessoal,

Já tive problemas semelhantes ao que vocês postaram aqui. No meu caso, eu tinha um problema exatamente com as Exceptions, pois se, ao inserir um dado numa tabela e ocorrece a bendita exception, de fato uma numeração era pulada, pois esse controle era feito na aplicação através do nextval(), e logo quando chama essa função, ela já pega o proximo valor, inserindo o registro ou não. Resolvi o problema inserindo o campo como serial e, uma vez que não há uma transação concluida com sucesso (commit), o numero não é utilizado, não deixando furos em sua tabela.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar