Pular para o conteúdo
  • Este tópico contém 3 respostas, 3 vozes e foi atualizado pela última vez 18 anos atrás por chduarte.
Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #78288
    Anônimo

      Olá, amigos!
      Tenho em uma procedure um cursor mais ou menos com a estrutura abaixo. Minha dúvida é a seguinte: consigo através de um parâmetro de entrada na procedure deixar essa busca mais genérica, de forma que não seja necessário digitar o nome corretamente, mas sim as primeiras letras.
      Só ressaltando, p_NOME é um parametro de entrada de minha procedure.
      Tentei usar as formas abaixo, porém não funcionaram. Muito obrigado pela ajuda, amigos!

      WHERE CD_FORM_PGTO = V_CD_FORM_PGTO AND Upper(NOME) like %
      p_NOME%;

      WHERE CD_FORM_PGTO = V_CD_FORM_PGTO AND NOME like %p_NOME%;

      OPEN V_BUSCA FOR
      SELECT CD_BANC , NOME, CIDADE , CD_PAIS
      FROM T4.TB_BANC B
      JOIN T4.TB_PAIS P ON (P.CD_PAIS=B.CD_PAIS)
      JOIN T4.TB_PAIS_FORM_PGTO PF ON (PF.CD_PAIS=P.CD_PAIS)
      WHERE CD_FORM_PGTO = V_CD_FORM_PGTO AND NOME = p_NOME;

      #78294
      chduarte
      Participante

        Na verdade esta correta as duas sintaxes, o problema é o como esta vindo este parametro p_nome.

        Utilizando o %P_NOME% deveria trazer qualquer entrada que voce colocasse. O que pode estar acontecendo é que voce esta utilizando upper(nome) like %p_nome% e o parametro esta sem o uppercase.

        O ideal é voce tratar também o p_nome, assim temos:
        where upper(nome) like upper(%p_nome%);

        Voce tera um problema neste caso. Se a sua coluna possui um indice para este campo, o Oracle nao ira utiliza-lo a nao ser que crie um index baseado em funcao.

        []

        #78296
        CJones
        Participante

          Se voce quiser por exemplo as 3 primeiras letras do parametro voce pode criar uma variavel que receba a SUBSTR desse parametro e colocar a variavel na clausula WHERE ao inves do parametro. Por exemplo:

          declare
          varTeste VARCHAR2(100);
          BEGIN
          varTeste := SUBSTR (p_NOME, 1, 3); — pegara da posicao 1 até a 3

          WHERE CD_FORM_PGTO = V_CD_FORM_PGTO AND Upper(NOME) like %
          varTeste%;

          Nao sei se isso traria problemas em termos de performance. Mas deixaria sua busca mais generica.

          Espero ter ajudado.

          Grande [].

          #78299
          chduarte
          Participante

            Sempre que voce usa uma funcao em uma coluna indexada voce “Invalida” o indice. Isso pode forcar o banco fazer um Table Access Full gerando problemas de performance.

            Cast implicito também “Invalida” o indice.

            Grande []

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