Como fazer para não perder numeros no Auto incremento
14/04/2010
0
Luciano Barcelos
Posts
14/04/2010
Luciano Barcelos
14/04/2010
Luciano Barcelos
09/06/2010
Saulo Benvenutti
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 ';
17/06/2012
Maria Elizandra
Estou com esse mesmo problema...estou usando Adotable e AdoDataSet...
Obrigda
18/06/2012
Jair N.
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;
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
03/07/2012
Bill Cabral
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.
Clique aqui para fazer login e interagir na Comunidade :)