10 Replies Latest reply: May 10, 2018 5:12 PM by Eduardo DImperio RSS

    Utilizacao de FIELD em Select Oracle

    Eduardo DImperio

      Oi Gente,

       

      Tenho uma query sql e depois gostaria de transformar em algo incremental. Ate hoje eu usei uma solução de criar uma string e adicionar ela no where, mas gostaria de saber se é possivel utilizar um FIELD do qvd como clausula.

       

      //******************************************************************************

      //FIELD DO QVD

      MO_ISSUE_FIELD_STRING:

      ISSUE_ID

          FROM

          [lib://Dados/TESTE/MO_ISSUE_FIELD_STRING.qvd](qvd);

      //******************************************************************************

      //CONCATENACAO DA EXTRACAO DOS CASOS NOVOS

       

      CONCATENATE(MO_ISSUE_FIELD_STRING) 

      //******************************************************************************

      MO_ISSUE_FIELD_STRING:

      Load

          ID_ISSUE_FIELD_STRING AS ISSUE_FIELD_STRING_ID,

          ISSUE_FIELD_ID,

          ISSUE_ID,

          FIELD_ID  AS CATEGORY_ID,

          FIELD_VALUE AS CATEGORY_VALUE,

          1 AS ID_STORAGE_TYPE

      ;

      select

          ID_ISSUE_FIELD_STRING,

          ISSUE_FIELD_ID,

          ISSUE_ID,

          FIELD_ID,

          FIELD_VALUE

      from MO_ISSUE_FIELD_STRING

      where

      ????? //GOSTARIA DE COLOCAR AQUI APENAS OS CASOS ONDE ID_ISSUE NAO EXISTA NO QVD


      //********************************************************************************

      //GAMBIARRA QUE EU USO ATUALMENTE PARA GERAR AUX QUE VAI NA CLAUSULA WHERE

      LET vWHERE='';

      LET Aux='';

       

      ID_ISSUE_LIST:

      load

      DISTINCT

      ISSUE_ID

      RESIDENT MO_ISSUE;

       

      For Each ISSUE_ID in FieldValueList('ISSUE_ID')

       

      Aux='ISSUE_ID='& $(ISSUE_ID)&' OR ';

      vWHERE=Aux& vWHERE;

      NEXT

       

      If Aux='' then

      exit Script;

      endif

      Aux=LEFT(vWHERE,LEN(vWHERE)-3);

      ********************************************************************************

       

        • Re: Utilizacao de FIELD em Select Oracle
          Alessandro Furtado

          Eduardo,

           

          da uma olhada no Exists()

           

          Podes usar ele em conjunto com o Where e assim podes ler ou ignorar dados já lidos ou não lidos

           

          Where Not Exists(Campo)           // Neste Caso le quando o Campo ainda nao tiver sido lido anteriormente

           

          Where Exists(Campo)    // Le se o Campo ja estiver sido lido antes

           

          e quando falo do Campo me refiro ao conteúdo do campo.

           

          Mas este especificamente seria com LOAD

           

          LOAD

              Campo1,

              Campo2,

              Campo3

          Where Exists(Campo1);

          SQL SELECT Campo1,Campo2,Campo3 From Table;

          • Re: Utilizacao de FIELD em Select Oracle
            Eduardo DImperio

            Oi Alessandro, tudo bem?

             

            Então o Exists() do SQL exige uma subquery e eu nao tenho ela porque o valor que eu quero esta em um qvd e nao em um banco enquanto o comando Exists() do QS não vai impedir de eu extrair tudo do banco e depois fazer o filtro, o que seria bem ruim pra mim pois são muitos dados.

                • Re: Utilizacao de FIELD em Select Oracle
                  Eduardo DImperio

                  A ideia parece genial, mas esse precending load nao vai fazer meu select trazer todo mundo e só depois selecionar o que eu quero?

                  Ex:

                   

                  MO_ISSUE_FIELD_STRING:

                  Load

                      ISSUE_ID,

                  Where ISSUE_ID<100

                  ;

                  select

                      ISSUE_ID,

                  from MO_ISSUE_FIELD_STRING;

                   

                  Se eu fizer isso, ele vai fazer um select no banco só de quem for menor que cem ou ele vai trazer todo mundo e depois filtrar dessa tabela os que são menores que 100?

                    • Re: Utilizacao de FIELD em Select Oracle
                      Alessandro Furtado

                      Eduardo, tens razão. Tinha lido rápido e me parecia que era leitura do QVD para concatenar, por isto falei do Where Exists().

                       

                      Mas se entendi o que queres, seria ler do banco de dados o ISSUE_ID maior do que o lido anteriormente e que esta em QVD.   Se for isto, segue uma ideia abaixo:

                       

                       

                       


                      //===============================================================================================

                      // Aqui le somente o campo ISSUE_ID para pegar o ultimo (partindo da premissa que é o maior)

                      MO_ISSUE_FIELD_STRING:

                      LOAD

                          max(ISSUE_ID) as ISSUE_ID

                      FROM [lib://Dados/TESTE/MO_ISSUE_FIELD_STRING.qvd](qvd);

                      //

                      Let vMaior = Peek('ISSUE_ID');

                      //


                      drop table MO_ISSUE_FIELD_STRING;

                      //===============================================================================================

                      // Vamos ler do banco de dados a partir do maior numero ISSUE_ID lido antes....

                      Tabela:

                      select

                          ID_ISSUE_FIELD_STRING    as ISSUE_FIELD_STRING_ID,

                          ISSUE_FIELD_ID,

                          ISSUE_ID,

                          FIELD_ID as CATEGORY_ID,

                          FIELD_VALUE as CATEGORY_VALUE

                      from MO_ISSUE_FIELD_STRING

                      where ISSUE_ID >= $(vMaior);

                      //===============================================================================================

                      //

                      // Se quiser juntar com QVD ja criado antes...

                      // Usamos o NOT EXISTS para ter certeza que nao vamos ler do QVD nenhum registro lido do banco de dados

                      // *****IMPORTANTE - Estou levando em consideração que os nomes do que esta sendo lido no SQL e o do QVD

                      // sao iguais

                      concatenate (Tabela)

                      LOAD

                          *

                      FROM [lib://Dados/TESTE/MO_ISSUE_FIELD_STRING.qvd](qvd)

                      Where not exists(ISSUE_ID);


                      // O novo arquivo tera os dados do SQL e do QVD e sera SOBREPOSTO ao antigo QVD

                      // ******* CUIDADO com carga parcial....perde o historico....podes controlar para evitar isto com

                      // QvdNoOfRecords() e NoOfRows()    Ou seja, se a qtde em memoria for maior ou igual do que a do QVD podes salvar

                      store Tabela into [lib://Dados/TESTE/MO_ISSUE_FIELD_STRING.qvd](qvd);

                      DROP Table Tabela;



                    • Re: Utilizacao de FIELD em Select Oracle
                      Eduardo DImperio

                      Alessandro, fiz dois testes pra efeito de comparação

                       

                       

                      MO_ISSUE_FIELD_STRING:

                      Load

                          ID_ISSUE_FIELD_STRING AS ISSUE_FIELD_STRING_ID,

                          ISSUE_FIELD_ID,

                          ISSUE_ID,

                          FIELD_ID  AS MO_ISSUE_FIELD_STRING_CATEGORY_ID,

                          FIELD_VALUE AS MO_ISSUE_FIELD_STRING_CATEGORY_VALUE,

                          1 AS ID_STORAGE_TYPE

                      ;

                      select

                          ID_ISSUE_FIELD_STRING,

                          ISSUE_FIELD_ID,

                          ISSUE_ID,

                          FIELD_ID,

                          FIELD_VALUE

                      from MO_ISSUE_FIELD_STRING

                      WHERE ISSUE_ID >=270166;

                       

                      17 segundos de processamento

                      //****************************************************************************************************************

                      MO_ISSUE_FIELD_STRING:

                      Load

                          ID_ISSUE_FIELD_STRING AS ISSUE_FIELD_STRING_ID,

                          ISSUE_FIELD_ID,

                          ISSUE_ID,

                          FIELD_ID  AS MO_ISSUE_FIELD_STRING_CATEGORY_ID,

                          FIELD_VALUE AS MO_ISSUE_FIELD_STRING_CATEGORY_VALUE,

                          1 AS ID_STORAGE_TYPE

                          WHERE ISSUE_ID >=270166

                      ;

                      select

                          ID_ISSUE_FIELD_STRING,

                          ISSUE_FIELD_ID,

                          ISSUE_ID,

                          FIELD_ID,

                          FIELD_VALUE

                      from MO_ISSUE_FIELD_STRING;

                       

                      abortado depois de 10 min

                      //****************************************************************************************************************