Ir para conteúdo
Fórum Script Brasil
  • 0

Peger o ultimo registro de uma tabela no oracle


prod

Pergunta

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

  • 0
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

prod, 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

Link para o comentário
Compartilhar em outros sites

  • 0

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

Link para o comentário
Compartilhar em outros sites

  • 0
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

prod, 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

Link para o comentário
Compartilhar em outros sites

  • 0

Olá matheus obrigado novamente

Com 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

Link para o comentário
Compartilhar em outros sites

  • 0
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 por Micheus
Link para o comentário
Compartilhar em outros sites

  • 0
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 aqui

Abraços

Editado por prod
Link para o comentário
Compartilhar em outros sites

  • 0
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 registro

Ou dá uma olhada no manual de oracle

http://www.scribd.com/doc/988390/Manual-Oracle

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

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

Link para o comentário
Compartilhar em outros sites

  • 0

Entendi sim micheus estava pensando em algo mais ou menos do tipo

Vou 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 por prod
Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...