8 Replies Latest reply on Jan 14, 2019 7:39 PM by J.Laurindo Chiappa

    Como extrair IP pelo hostname

    Jonts

      Tudo bem?

      Sou iniciante no contexto de PL\SQL Oracle.

       

      Oracle Database 11g Release 11.2.0.4.0 - 64bit Production

       

      Tenho uma tabela de log que mostra quantas vezes o computador acessou uma aplicação, mas mostra somente o nome do computador.

      select UPPER(ds_maquina) ds_maquina, 
      count(ds_maquina) qtd_estacao
      from Log_Acesso where dt_acesso between '01/10/2018' AND '10/10/2018'
      and ds_maquina is not null
      group by UPPER(ds_maquina)
      order by UPPER(ds_maquina)
      

       

      Pesquisei e achei SELECT UTL_INADDR.get_host_address mas não sei como poderia montar o select.

       

      Como posso mostrar o IP pelo nome do hostname? Queria criar uma coluna IP ao lado do host.

        • 1. Re: Como extrair IP pelo hostname
          J.Laurindo Chiappa

          Bom, vc não diz mas eu Entendo que nessa tua tabela LOG_ACESSO essa coluna DS_MAQUINA é o HOSTNAME que está registrado na Rede, é isso mesmo ?? SE SIM, e ** SE ** ambas as máquinas (tanto o servidor Oracle QUANTO a máquina-cliente cujo hostname tá registrado nessa tabela) se comunicam via rede é super-simples, basta vc informar esse HOSTNAME numa chamada à built-in GET_HOST_ADDRESS.... E como Acredito que vc sabe, vc PODE SIM chamar built-ins que não façam DML ou DDL naturalmente num SELECT qquer, exemplo :

           

          ==> vou passar como Argumento um host name que EXISTE na Rede, mas não está registrado no mesmo DNS em uso pelo servidor Oracle :

           

          chiappa@DESENV:SQL>SELECT UTL_INADDR.get_host_address('Dell15R') FROM dual;

          SELECT UTL_INADDR.get_host_address('Dell15R') FROM dual

                 *

          ERRO na linha 1:

          ORA-29257: host Dell15R unknown

          ORA-06512: at "SYS.UTL_INADDR", line 19

          ORA-06512: at "SYS.UTL_INADDR", line 40

          ORA-06512: at line 1

           

           

          ==> Agora vou usar um HOSTNAME que existe e o servidor Oracle sabe como resolver :

           

           

          chiappa@DESENV:SQL>SELECT UTL_INADDR.get_host_address('VM01') FROM dual;

           

          UTL_INADDR.GET_HOST_ADDRESS('VM01')

          -----------------------------------------------------------------

          192.168.10.175

           

          chiappa@DESENV:SQL>

           

          ==> Funciona perfeitamente, achou o IP... O efeito vice-versa, ie, achar o HOST fornecendo um IP, é similar, muda só o built-in  :

           

           

          chiappa@DESENV:SQL>SELECT UTL_INADDR.get_host_name('192.168.10.175') from dual;

           

          UTL_INADDR.GET_HOST_NAME('192.168.10.175')

          ---------------------------------------------------------------------------------------------------------

          VM01

           

          chiappa@DESENV:SQL>

           

          ==> No seu caso, SE essa tal coluna contém um hostname válido E resolvível pela rede a partir do servidor Oracle, tua query vai ser simplesmente :

           

              select UPPER(ds_maquina) ds_maquina,

                      UTL_INADDR.get_host_address(ds_maquina) IP_DA_MAQUINA_CLIENTE,

              count(ds_maquina) qtd_estacao 

              from Log_Acesso where dt_acesso between '01/10/2018' AND '10/10/2018' 

              and ds_maquina is not null 

              group by UPPER(ds_maquina), UTL_INADDR.get_host_address(ds_maquina) 

              order by UPPER(ds_maquina)  ;

              

          ==> okdoc ?? E se vc não quiser ficar repetindo as mesmas chamadas no GROUP BY, vc pode usar o exemplo abaixo (onde eu APROVEITEI para CORRIGIR a sua lógica, se essa coluna DT_ACESSO realmente é do datatype DATE, que no Oracle contém data E hora) :

           

          select DS_MAQUINA, IP_DA_MAQUINA_CLIENTE, count(ds_maquina) QTD_ESTACAO

            from (select UPPER(ds_maquina)                       ds_maquina,

                          UTL_INADDR.get_host_address(ds_maquina) ip_da_maquina_cliente,

                          from Log_Acesso

                                where dt_acesso between TO_DATE('01/10/2018 00:00:00', 'dd/mm/yyyy hh24:mi:ss')

                                              and TO_DATE('10/10/2018 23:59:59', 'dd/mm/yyyy hh24:mi:ss')

                           and ds_maquina is not null 

                        )

          group by DS_MAQUINA, IP_DA_MAQUINA_CLIENTE

          order by DS_MAQUINA;

           

          Abraços,

           

             Chiappa

          • 2. Re: Como extrair IP pelo hostname
            Jonts

            Bom dia Chiappa, Obrigado pelo retorno completo rsrsr, O "DS_MAQUINA" é hostname, isso mesmo. Vou implementar aqui e já te dou feedback... Muito Obrigado...

            • 3. Re: Como extrair IP pelo hostname
              Jonts

              Boa tarde Chiappa, Deu certo muito obrigado...

              • 4. Re: Como extrair IP pelo hostname
                Jonts

                Boa tarde,

                Uma pergunta sobre o select enviado, como faço para tratar quando na lista dos Hostname aparece um que mostra desconhecido, nesse caso não mostra IP mas não lista as informações. Está em anexo o erro que mostra

                 

                Como faço para mostrar mesmo não tendo IP?

                • 6. Re: Como extrair IP pelo hostname
                  J.Laurindo Chiappa

                  Blz ? Então, como eu disse o RDBMS Oracle simplesmente acessa os serviços de rede do servidor : se é reportado pela Servidor que um hostname não pôde ser resolvido, Não Tem o que fazer dentro do RDBMS - o RDBMS é um simples "cliente"/usuário dos serviços de Rede do servidor....

                  • 7. Re: Como extrair IP pelo hostname
                    Jonts

                    Boa tarde,

                    Obrigado pela orientação Chiappa.

                    • 8. Re: Como extrair IP pelo hostname
                      J.Laurindo Chiappa

                      Uma coisa que vc pode fazer para não mostrar erro pro usuário é, ao invés de chamar diretamente a função Oracle na sua SELECT, vc chamar ao invés uma função sua que por sua vez chama a built-in Oracle : aí na sua função vc controla / manipula erros via EXCEPTION... Tipo :

                       

                      create or replace function RETORNA_IP (P_HOSTNAME in VARCHAR2) return VARCHAR2 is

                         v_IP  varchar2(50);

                      BEGIN

                         Begin

                            v_ip := UTL_INADDR.get_host_address(P_HOSTNAME);

                         Exception

                            when OTHERS then

                               v_ip := 'Desconhecido do servidor Oracle!!';

                         End;

                         return v_ip;

                      END;

                      /

                       

                       

                      Aí teu select passa a ser :

                       

                      select DS_MAQUINA, IP_DA_MAQUINA_CLIENTE, count(ds_maquina) QTD_ESTACAO

                        from (select UPPER(ds_maquina)                       ds_maquina,

                                      RETORNA_IP(ds_maquina) ip_da_maquina_cliente,

                                from Log_Acesso

                               where dt_acesso between TO_DATE('01/10/2018 00:00:00', 'dd/mm/yyyy hh24:mi:ss')

                                                   and TO_DATE('10/10/2018 23:59:59', 'dd/mm/yyyy hh24:mi:ss')

                                 and ds_maquina is not null

                               )

                       

                      group by DS_MAQUINA, IP_DA_MAQUINA_CLIENTE

                      order by DS_MAQUINA;  

                       

                      ==> Okdoc ??? Eu não testei, escrevo de cabeça aqui, então NÃO USE diretamente esse código, assuma que é um MODELO, um EXEMPLO apenas, certo ?? E  isso que eu fiz é manipulação e controle de erro naturais do PL/SQL, blz ?? Se vc não tinha o conceito de como o usar, dá uma lida no manual PL/SQL correspondente....