Jump to content
Fórum Script Brasil
  • 0

Peger o ultimo registro de uma tabela no oracle


prod

Question

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 to post
Share on other sites

9 answers to this question

Recommended Posts

  • 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 to post
Share on other 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 to post
Share on other 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 to post
Share on other 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 to post
Share on other 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

Edited by Micheus
Link to post
Share on other 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

Edited by prod
Link to post
Share on other 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 to post
Share on other 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 to post
Share on other 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

Edited by prod
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      149296
    • Total Posts
      645693
×
×
  • Create New...