Pular para o conteúdo
  • Este tópico contém 7 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 12 meses atrás por David Siqueira.
Visualizando 8 posts - 1 até 8 (de 8 do total)
  • Autor
    Posts
  • #85947
    Avatar photoRegis Araujo
    Participante

      Salve 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
      --------------
      9985545

      Agora 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..!!

      #85951
      Rodrigo Almeida
      Participante

        Regis,

        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

        #85955
        Avatar photoRegis Araujo
        Participante

          Fala 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…

          #85959
          David Siqueira
          Participante

            E 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

            #85960
            Avatar photoRegis Araujo
            Participante

              Fala 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…

              #85961
              David Siqueira
              Participante

                Que 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!!!!

                #85962
                Avatar photoRegis Araujo
                Participante

                  Fala 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..!!!

                  #85963
                  David Siqueira
                  Participante

                    Entendi maninho..bom então é isso, tudo nosso.
                    Abração!!!

                    Se cuida!

                    David

                  Visualizando 8 posts - 1 até 8 (de 8 do total)
                  • Você deve fazer login para responder a este tópico.