Fiz está transação para poder implementar em minha aplicação porem nos testes em BD ele me retorna a seguinte mensagem "AVISO: não há uma transação em execução"
não sei o por que está acontecendo isso porem mesmo ele dando está mensagem ele está fazendo a inserção corretamente no BD.
Está transação iz para pegar o ultimo numero que foi feito inserção para eu por em uma outra tabela.
Alguém tem alguma ideia do que seja
.
start transaction;
insert into sc_endereco.tb_estados(fi_estado,fi_abreviatura)values('no outro','ou');
insert into sc_endereco.tb_t(fi_t)values((select last_value from sc_endereco.seq_estados));
commit;
end;
Qual BD você está utilizando? Ao que parece não foi identificado um início de transação… Caso for PostgreSQL tente begin ao invés de start
Fiz a alteração para BEGIN porem ainda está dando a mesma mensagem
Você está rodando essas queries em alguma ferramenta ou já na sua aplicação?
Você está utilizando qual BD?
Estou utilizando o PgAdmin III
Meu Banco de Dados é Postgres Versao 8.4
se não é uma função pl/pgsql, o “end” é desnecessário… geralmente quando faço transações pelo pgAdmin sempre faço da seguinte maneira:
[code]begin transaction;
… -inserções, atualizações, etc…
commit;[/code]
Dê uma olhada na documentação
Funcionou corretamente
Muito obrigado
só mais um detalhe…
você pretende utilizar essas mesmas queries em alguma transação na sua aplicação?
insert into sc_endereco.tb_estados(fi_estado,fi_abreviatura)values('no outro','ou');
insert into sc_endereco.tb_t(fi_t)values((select last_value from sc_endereco.seq_estados));
pois essa forma é um tanto quanto arriscada se você trabalhar com um número considerável de acessos.
Repare que você está pegando o last_value de uma sequence que foi utilizada na primeira query (imagino que você utilize o próximo valor da sequence como valor default para a tb_estados). Levando em conta que você pode ter essa transação em paralelo, nada garante que o teu last_value da segunda query irá retornar sempre o valor utilizado na primeira…
Claro que a margem de erro é muito pequena considerando os milissegundos de execução de um insert no PostgreSQL, mas como eu disse, se você tiver um fluxo grande, isso pode acontecer…
Amigo estou mesmo preocuado com esta situação do last_value como comentou anteriormente
porem sou iniciante em postgres e não sei como realizar esta operação de uma forma mais segura.
Estou desenvolvendo um Sofware para uma empresa na hora da inserção tenho que pegar o ID da primeira tabela e passar para uma outra tabela
voce sabe de alguam solução para este problema.
[quote=jorgereidinaldo]Amigo estou mesmo preocuado com esta situação do last_value como comentou anteriormente
porem sou iniciante em postgres e não sei como realizar esta operação de uma forma mais segura.
Estou desenvolvendo um Sofware para uma empresa na hora da inserção tenho que pegar o ID da primeira tabela e passar para uma outra tabela
voce sabe de alguam solução para este problema.[/quote]
Você pode fazer uma query separada para pegar o próximo valor da sequence e assim utilizar esse valor em memória para as outras…
Caso vc utilize JDBC puro, por exemplo, na sua DAO faça um método que retorne o valor da sequence e a armazene numa variável local, repassando esse valor para as outras duas queries…