Pular para o conteúdo
  • Este tópico contém 5 respostas, 3 vozes e foi atualizado pela última vez 12 anos atrás por Avatar de dcarvalhodcarvalho.
Visualizando 6 posts - 1 até 6 (de 6 do total)
  • Autor
    Posts
  • #104714
    Avatar de airoospairoosp
    Participante

      Boa tarde,

      Alguém sabe se é possível substituir o conteúdo de uma variável em uma procedure conforme o valor passado no parâmetro.

      Por exemplo:

      create procedure pesquisa_conta
      (
      pEmpresa in varchar2
      ,pNumero out varchar2
      )
      is

      v_numero_conta varchar2(10);

      begin

      if pEmpresa = 20 then

      select nr_conta into v_numero_conta
      from cliente_20;

      elsif pEmpresa = 60 then

      select nr_conta into v_numero_conta
      from cliente_60;

      end if;

      pNumero:=v_numero_conta;

      end;

      O que eu quero fazer é usar uma variável para passar o nome da tabela e utilizar apenas um select.

      .
      .
      .
      v_nome_tabela varchar2(10);

      begin

      if pEmpresa = 20 then
      v_nome_tabela:= ‘cliente_20’;
      else
      v_nome_tabela:= ‘cliente_60’;
      end if;

      select nr_conta into v_numero_conta
      from v_nome_tabela;

      pNumero:=v_numero_conta;

      end;

      Tentei fazer alguma coisa usando &v_nome_tabela ao invés do “execute immediate” mas não funcionou, ocorreu um erro na hora de compilar.

      Se alguém tiver alguma dica, agradeço.

      Obrigado.

      Airton

      #104715
      Avatar de rmanrman
      Participante

        @airoosp

        Segue a solução utilizando EXECUTE IMMEDIATE:


        create procedure pesquisa_conta
        (
        pEmpresa in varchar2
        ,pNumero out varchar2
        )
        is
        v_numero_conta varchar2(10);
        v_nome_tabela varchar2(30);
        begin

        if pEmpresa = 20 then
        v_nome_tabela:= 'cliente_20';
        else
        v_nome_tabela:= 'cliente_60';
        end if;

        EXECUTE IMMEDIATE 'select nr_conta from '||v_nome_tabela INTO v_numero_conta;

        pNumero := v_numero_conta;

        end;

        #104716
        Avatar de airoospairoosp
        Participante

          Entendi a solução, mas sem o execute immediate não é possível fazer, correto?

          A ideia seria utilizar macro substituição.

          Airton

          #104717
          Avatar de rmanrman
          Participante

            @airoosp

            Macro substituição não seria uma funcionalidade do sqlplus?

            #104718
            Avatar de airoospairoosp
            Participante

              Então, isso que eu gostaria de saber se a macro substituição pode ser usada ou não.

              Airton

              #104719
              Avatar de dcarvalhodcarvalho
              Participante

                Oi Airton,

                Você pode utilizar refcursor como no exemplo que criei abaixo:

                [i]DECLARE

                cur_obj SYS_REFCURSOR;
                v_obj_name dba_objects.object_name%TYPE;
                v_table VARCHAR2(40) := ‘dba_objects’;
                v_obj_id Dba_Objects.object_id%TYPE := 54158;

                BEGIN

                OPEN cur_obj FOR ‘select object_name from ‘||v_table||’ where object_id = :b1′ USING v_obj_id;
                LOOP

                FETCH cur_obj INTO v_obj_name;
                EXIT WHEN cur_obj%NOTFOUND;

                DBMS_OUTPUT.PUT_LINE(v_obj_name);

                END LOOP;
                CLOSE cur_obj;

                END;
                /[/i]

                Caso opte pelo execute immediate, não esqueça de usar o USING para bind variable =)

                Abraço,
                Danilo Carvalho
                https://www.profissionaloracle.com.br/blogs/dcarvalho

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