prod Postado Março 2, 2009 Denunciar Share Postado Março 2, 2009 Pessoal estou desenvolvendo um sistema web e preciso pegar o ultimo id de uma tabela e apresentar para o cliente, poderia usar a fuinçaõ max(), mas tem um problema como é um sistema web pode acontecer de mais de uma pessoa efetuar o cadastro ao mesmo tempoentão não necessriamente o ultimo registo é o do cliente, gostaria de saber se alguém conhece alguma função no oracle que consiga tratar isso Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Março 3, 2009 Denunciar Share Postado Março 3, 2009 Pessoal estou desenvolvendo um sistema web e preciso pegar o ultimo id de uma tabela e apresentar para o cliente, poderia usar a fuinçaõ max(), mas tem um problema como é um sistema web pode acontecer de mais de uma pessoa efetuar o cadastro ao mesmo tempo então não necessriamente o ultimo registo é o do cliente, gostaria de saber se alguém conhece alguma função no oracle que consiga tratar issoprod, eu penso que independente do banco em questão, isto será um "problema" existente em todos eles. Você só terá o identificador exato, no momento em que adicionar o registro na tabela (ou fração de tempo antes, chamando o max, caso você não use a auto-numeração, trigger, ou coisa parecida).Mesmo em um sistema desktop, isto está sujeito a ocorrer - apenas em sistemas mono-usuários isto certamente não ocorre.O único jeito de você obter um número e ele não ser usado, seria guardá-lo em uma tabela, de modo que uma nova busca pudesse pegar corretamente o próximo. Mas, se um dos usuários cancela o processo, poderia ficar um "buraco" ou teria que haver um meio de este número ficar disponível para outro cadastro posterior.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 prod Postado Março 9, 2009 Autor Denunciar Share Postado Março 9, 2009 Micheus primeiro obrigao por ter respondido o meu post e me deculpe demorar em responder Então quer dizer que pelo banco de dados não há nada que eu possa fazer para tratar isso precisaria ser via programação?Obs o campo id é auto incrementado Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Março 10, 2009 Denunciar Share Postado Março 10, 2009 Então quer dizer que pelo banco de dados não há nada que eu possa fazer para tratar isso precisaria ser via programação?Obs o campo id é auto incrementadoprod, sendo auto-incrementado você não tem mesmo controle algum sobre este número - na aplicação muiti-usuário o banco irá gerenciar corretamente este campo, evitando qualquer possibilidade de duplicação ou falha na continuidade dele.Se fosse controlado via programação, como eu disse antes, você teria que obter este número (max +1) apenas momentos antes de gravar a informação efetivamente (normalmente seria em uma trigger). Lembre-se que para minimizar o risco de mais que um usuário obter o mesmo código, ele deve ser obtido num último momento. Não sei exatamente qual a necessidade de você ter esta informação antes de gravar o registo, mas não é uma boa prática pelo que já comentei.Se isto realmente é importante, então o único modo que vejo é você usar uma tabela para fazer o gerenciamento dos códigos, mas não sei até onde isso valeria a pena.Espero que mais algum outro colega se manifeste a respeito.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 prod Postado Março 10, 2009 Autor Denunciar Share Postado Março 10, 2009 Olá matheus obrigado novamenteCom relação em ter informação antes de gravar o registo não tem necessidade mesmo, minha insegurança é o seguinte.vamos supor eu fiz um insert na tabela e agora preciso fazer um select para pegar o ultimo registro, só que antes de executar o select um outro usuário envie as informações ao servidor e será inserido um novo registro. Quando o select for executado ele não pegará o registro certo porque já foi inserido um outro. Daí não sei se o banco de dados consegue gerenciar isto para que este tipo de anomalias não ocorra Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Março 10, 2009 Denunciar Share Postado Março 10, 2009 (editado) Olá matheus :huh: :blink: vamos supor eu fiz um insert na tabela e agora preciso fazer um select para pegar o ultimo registro, só que antes de executar o select um outro usuário envie as informações ao servidor e será inserido um novo registro. Quando o select for executado ele não pegará o registro certo porque já foi inserido um outro.Acho que você está falando sobre obter o código gerado para o registro que você acabou de inserir, não seria isto?Isto é algo que eu no momento não saberia lhe dizer exatamente, mas programando em Delphi, deveria ser possível você obtê-lo logo após ao post. Se não me engano, ao usar o componente TZUpdateSQL(da biblioteca ZeosLib), a propriedade UseSequenceFieldForRefreshSQL viabiliza a obtenção dos campos auto-numeração (sequence) após o post/commit.Abraços Editado Março 10, 2009 por Micheus Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 prod Postado Março 11, 2009 Autor Denunciar Share Postado Março 11, 2009 (editado) Acho que você está falando sobre obter o código gerado para o registro que você acabou de inserir, não seria isto?É exatamente isso Micheus, Mas aqui na aplicação estou utilizando java com oracle. Continuarei pesquisando caso encontre uma solução posto aquiAbraços Editado Março 11, 2009 por prod Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Março 12, 2009 Denunciar Share Postado Março 12, 2009 vamos supor eu fiz um insert na tabela e agora preciso fazer um select para pegar o ultimo registro, só que antes de executar o select um outro usuário envie as informações ao servidor e será inserido um novo registro. Quando o select for executado ele não pegará o registro certo porque já foi inserido um outro.Experimente um contador de registros: Select Count(1) from tabela // ( muito mais rapido do que Count(*) ) antes de salvar o registroOu dá uma olhada no manual de oraclehttp://www.scribd.com/doc/988390/Manual-Oracleabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Março 13, 2009 Denunciar Share Postado Março 13, 2009 Jhonas, não estou certo de que o Count ajudaria, porque apenas diria quantos itens há na tabela mas não seria necessariamente o maior valor armazenado no banco (Max) - supondo que normalmente há registros excluídos.prod, conversei com minha esposa (que trabalhou com Oracle há algum tempo) e ela disse que talvez você pudesse fazer uso de uma variável local a sua transação para inicializar e obter o valor em questão. A idéia seria criar uma trigger do tipo pós-insert onde você obteria o valor do registro recém incluído via NEW.<nome campo> e atribuindo seu valor para uma variável com escopo de visualização para a sua conexão (não global). Assim, após você postar o registro no seu código, você poderia fazer um select sobre esta variável para obter o valor do campo.Não sei se consegui explicar direito, mas pareceu-me uma possibilidade, porém você precisaria dar uma pesquisada na documentação de como fazer isto.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 prod Postado Março 16, 2009 Autor Denunciar Share Postado Março 16, 2009 (editado) Entendi sim micheus estava pensando em algo mais ou menos do tipoVou dar uma olhada na documentação do oracle e ver como faço para implementar isso Obrigado e obrigado também jhones o tutorial que passou é muito interessante Editado Março 16, 2009 por prod Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
prod
Pessoal estou desenvolvendo um sistema web e preciso pegar o ultimo id
de uma tabela e apresentar para o cliente, poderia usar a fuinçaõ max(), mas tem um problema
como é um sistema web pode acontecer de mais de uma pessoa efetuar o cadastro ao mesmo tempo
então não necessriamente o ultimo registo é o do cliente, gostaria de saber se
alguém conhece alguma função no oracle que consiga tratar isso
Link para o comentário
Compartilhar em outros sites
9 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.