- Este tópico contém 7 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 12 meses atrás por
David Siqueira.
-
AutorPosts
-
25 de março de 2009 às 10:28 pm #85947
Regis Araujo
ParticipanteSalve galera do bem..!!
Mais uma dúvida me assombra…!!
Em uma das aplicações utilizadas na empresa, se fez necessário realizar um select com skip locked, porém ai está minha surpresa… o select não retornou nada.. é.. exatamente isto.. nada.. Pesquisando.. e pesquisando.. encontramos uma solução.. mas a minha dúvida é o pq… pqqqqq.. pq isto acontece…Select que não retornou nada…
SQL> SELECT IDCLIENTE FROM TB_CLIENTE
WHERE TB_CODCLIE = pCODCLIE
FOR UPDATE SKIP LOCKED;IDCLIENTE
--------------Select que retornou os dados….
SQL> SELECT IDCLIENTE FROM TB_CLIENTE
WHERE TB_CODCLIE in (pCODCLIE,0)
FOR UPDATE SKIP LOCKED;IDCLIENTE
--------------
9985545Agora a dúvida.. pq isto aconteceu?? Pq somente com a inclusão do “in (pCODCLIE,0)” houve o retorno dos dados..
Ahhh.. isto somente acontece quando o campo de comparação é do tipo NUMBER…
Abraços galera..!!
26 de março de 2009 às 3:00 am #85951Rodrigo Almeida
ParticipanteRegis,
O parâmetro que está usando não está passando valor NULO?
SELECT IDCLIENTE FROM TB_CLIENTE
WHERE TB_CODCLIE in (pCODCLIE,0)
FOR UPDATE SKIP LOCKED;Porquê nesse SQL está usando o IN (pCODCLIE,0)?
Pq o 0 !!!
Se tirar as opções de controle FOR UPDATE SKIP LOCKED os erros são o mesmo?
Abraços,
Rodrigo Almeida
26 de março de 2009 às 3:39 pm #85955Regis Araujo
ParticipanteFala Rodrigão.. ble..!!
Então, não está passando valor nulo, pois também tentei realizar a consulta com um valor determinado.. e se eu usar o “FOR UPDATE SKIP LOCKED”, não retorna nada.. Não imprime nenhum erro, simplismente não retorna o valor que eu quero… Apenas retorna quando eu coloco o “IN (pCODCLIE,0)”, o valor que eu utilizei para o parametro “pCODCLIE” foi 51.
Só um adendo.. esta “dificuldade” apenas acontece na versão 8i e quando o parametro de comparação é uma chave primária…
SQL> SELECT IDCLIENTE FROM TB_CLIENTE
WHERE TB_CODCLIE = 51
FOR UPDATE SKIP LOCKED;IDCLIENTE
Assim funciona..
SELECT IDCLIENTE FROM TB_CLIENTE
WHERE TB_CODCLIE in (51,0)
FOR UPDATE SKIP LOCKED;IDCLIENTE
9985545
Eu utilizei o IN (pCODCLIE,0) pois sem ele não retorna o valor…
assim, ele retorna se eu utilizar qualquer número no lugar do 0.Acho que deve ser algum “BUG” do oracle nesta versão.. que nas demais já foi corrigido…
Abraços…
26 de março de 2009 às 4:46 pm #85959David Siqueira
ParticipanteE ai brother ..tudo na paz, bem eu não manjo muito dessa função pois nunca precisei usa-la, mais achei algo muito interessante que pode te ajudar, é uma espécie de Workaround, veja se atende as suas necessidades, segue o link abaixo :
http://www.orafaq.com/forum/t/46034/0/
Abcs.
David
26 de março de 2009 às 5:09 pm #85960Regis Araujo
ParticipanteFala David… ble?!?!
Opa.. valeu pela ajuda, tenho aqui uma function que fazer o lock do registro com for update nowait, mas este select que eu demonstrei está em uma aplicação fora do banco.. falei para a pessoa responsável por esta aplicação utilizar esta function, mas ele informou que a aplicação dele não pode utilizar a function.. que teria que ser com o select…
Acho que atualmente a minha dúvida maior é o motivo pelo qual se eu realizar um select “for update skip locked” que tenha como campo de comparação uma primary key, ele não me retorna nada.. somente se eu colocar o in (valor,0) que consigo retornar o valor desejado..
Realmente deve ser um bug do oracle 8i… testei no 10g e não apresentou a mesma dificuldade…
Vou ajustar minha function para que fique semelhante a esta do link que vc me passou.. pois achei mais pratica e garantida…..
Abraços e valeu David…
26 de março de 2009 às 5:31 pm #85961David Siqueira
ParticipanteQue Zica hein Regis meu velho, mais uma coisa que me intriga é porque tem que ser via SELECT apenas, a function será incorporada ao select, e outra coisa que me chamoua atenção é que essa função SKIP serve para pegar os registros que não estão em lock, não seria a mesma coisa que fazer o select normal???…Bom mais fica aqui minha contribuição espero que você consiga resolver.
Abraço!!!!
26 de março de 2009 às 5:43 pm #85962Regis Araujo
ParticipanteFala David..
Então.. tbm não sei o pq não pode ser com a function.. mas ele é o responsável pela aplicação neh.. eu acho que é devido a esta aplicação ser utilizada em outras empresas.. então ele não quer mudar alguma coisa no modelo deles…
Bom.. a dificuldade de fazer um select comum é que poderá retornar dados que estejam locados ou já sendo trabalhados.. ja que esta aplicação distribui registros para N funcionários.. (aqui é empresa de Call Center).
Bom.. o jeito foi mandar o IN (valor,0) mesmo.. isto não está impactando em nada nem aumentando a cardinalidade do banco..
Valeu pela ajuda..aquele Workaround vai ser util pois outras aplicações utilizam uma function para lockar registros…
Abraços..!!!
26 de março de 2009 às 5:50 pm #85963David Siqueira
ParticipanteEntendi maninho..bom então é isso, tudo nosso.
Abração!!!Se cuida!
David
-
AutorPosts
- Você deve fazer login para responder a este tópico.