Como fazer para não perder numeros no Auto incremento

PostgreSQL

14/04/2010

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

Curtidas 0

Respostas

Luciano Barcelos

Luciano Barcelos

14/04/2010

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

Luciano Barcelos

14/04/2010

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
GOSTEI 0
Saulo Benvenutti

Saulo Benvenutti

14/04/2010

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 '; 
GOSTEI 0
Maria Elizandra

Maria Elizandra

14/04/2010

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
GOSTEI 0
Jair N.

Jair N.

14/04/2010

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
GOSTEI 0
Bill Cabral

Bill Cabral

14/04/2010

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.
GOSTEI 0
POSTAR