Pular para o conteúdo
Visualizando 14 posts - 1 até 14 (de 14 do total)
  • Autor
    Posts
  • #87730
    Miro
    Participante

      Ola, gostaria de uma dica como fazer um loop no script abaixo, ou seja esse script pede uma data de referencia mas gostaria que pedisse a data 5 vezes pois tenho 5 periodos a consultar, ou ate mesmo modificar esse script para pedir 5 periodos de referencia, quem poder me ajudar fico grato

      segue escript:

      select sum
      (case when(r034fun.datadm <= ('&data') and exists(select 1 from r038hfi where r038hfi.numemp = r034fun.numemp and r038hfi.tipcol = r034fun.tipcol and r038hfi.numcad = r034fun.numcad and r038hfi.datalt <= ('&data')) and not exists (select 1 from r038afa where r038afa.numemp = r034fun.numemp and r038afa.tipcol = r034fun.tipcol and r038afa.numcad = r034fun.numcad and r038afa.datafa = (select max(r038afa.datafa) from r038afa, r010sit where r038afa.numemp = r034fun.numemp and r038afa.tipcol = r034fun.tipcol and r038afa.numcad = r034fun.numcad and r038afa.datafa <= ('&data') and r038afa.sitafa = r010sit.codsit and r010sit.tipsit = 7)) and r038hsa.datalt = (select max (datalt) from r038hsa tab3 where tab3.numemp = r038hsa.numemp and tab3.tipcol = r038hsa.tipcol and tab3.numcad = r038hsa.numcad and tab3.datalt <= '&data') and r038hsa.valsal = (select max (valsal) from r038hsa tab4 where tab4.numemp = r038hsa.numemp and tab4.tipcol = r038hsa.tipcol and tab4.numcad = r038hsa.numcad and tab4.datalt <= '&data')) then (r038hsa.valsal) end) from r034fun, r016hie, r010sit, r038hsa, r016orn where r034fun.sitafa = r010sit.codsit and r034fun.taborg = r016orn.taborg and r034fun.numloc = r016orn.numloc and r016hie.taborg = r016orn.taborg and r016hie.numloc = r016orn.numloc and r038hsa.numemp = r034fun.numemp and r038hsa.tipcol = r034fun.tipcol and r038hsa.numcad = r034fun.numcad and r034fun.numemp in (1,2) and r034fun.tipcol = 1 and r034fun.tipcon = 1

      #87735
      Ishii
      Participante

        Olá,

        Uma alternativa se eu entendi direito é colocar um &data diferente para cada caso. Tipo &data1, &data2, etc que ele vai pedir para cada parâmetro um novo valor, desta forma que esta se eu passar somente um (&data) ele será usado para os outros casos.

        []s Ishii

        #87736
        leo_jf
        Participante

          Olas,

          Acho que fica mais facil transformar em um bloco anônimo, e usar as variaveis que assim vc não se perde. Para saida dos dados geralmente uso o utl_file.

          Ou se achar complicado, faça com o Ishii falou que é bem legal também.
          P.s: Usa o plsdeveloper (RAD), que ajuda bem.

          DECLARE

          v_periodo_01 DATE;
          v_periodo_02 DATE;
          .
          .
          .

          BEGIN

          sua_query;

          END;

          Espero que ajude.
          []s

          #87737
          Miro
          Participante

            Ola, agradeço mas nao entendi muito bem ficaria assim : mas nao rodou

            select

            sum (case when(r034fun.datadm <= ('&&data1,&&data2') and exists(select 1
            from vetorh.r038hfi
            where r038hfi.numemp = r034fun.numemp
            and r038hfi.tipcol = r034fun.tipcol
            and r038hfi.numcad = r034fun.numcad
            and r038hfi.datalt <= ('&&data1,&&data2'))
            and not exists (select 1

              from vetorh.r038afa 
                 where r038afa.numemp = r034fun.numemp 
                     and r038afa.tipcol = r034fun.tipcol 
                       and r038afa.numcad = r034fun.numcad 
                         and r038afa.datafa = (select max(r038afa.datafa) 
            
              from vetorh.r038afa, vetorh.r010sit 
                 where r038afa.numemp = r034fun.numemp 
                     and r038afa.tipcol = r034fun.tipcol 
                       and r038afa.numcad = r034fun.numcad 
                         and r038afa.datafa &lt;= ('&amp;&amp;data1,&amp;&amp;data2') 
                           and r038afa.sitafa = r010sit.codsit 
                             and r010sit.tipsit = 7))
                               and r038hsa.datalt = (select max (datalt) 
            
              from vetorh.r038hsa tab3 
                 where tab3.numemp = r038hsa.numemp
                     and tab3.tipcol = r038hsa.tipcol 
                       and tab3.numcad = r038hsa.numcad 
                         and tab3.datalt &lt;= '&amp;&amp;data1,&amp;&amp;data2')
                           and r038hsa.valsal = (select max (valsal) 
            
              from vetorh.r038hsa tab4 
                 where tab4.numemp = r038hsa.numemp 
                     and tab4.tipcol = r038hsa.tipcol 
                       and tab4.numcad = r038hsa.numcad 
                         and tab4.datalt &lt;= '&amp;&amp;data1,&amp;&amp;data2'))
            
              then (r038hsa.valsal) end)
            
              from vetorh.r034fun,
                   vetorh.r016hie,
                   vetorh.r010sit,
                   vetorh.r038hsa,
                   vetorh.r016orn
            
                 where r034fun.sitafa = r010sit.codsit 
                     and r034fun.taborg = r016orn.taborg 
                       and r034fun.numloc = r016orn.numloc 
                         and r016hie.taborg = r016orn.taborg 
                           and r016hie.numloc = r016orn.numloc 
                             and r038hsa.numemp = r034fun.numemp 
                               and r038hsa.tipcol = r034fun.tipcol 
                                 and r038hsa.numcad = r034fun.numcad 
                                   and r034fun.numemp in (1,2) 
                                     and r034fun.tipcol = 1
                                       and r034fun.tipcon = 1
            

            [quote="Ishii":3uar8khw]Olá,

            Uma alternativa se eu entendi direito é colocar um &data diferente para cada caso. Tipo &data1, &data2, etc que ele vai pedir para cada parâmetro um novo valor, desta forma que esta se eu passar somente um (&data) ele será usado para os outros casos.

            []s Ishii[/quote]

            #87738
            Miro
            Participante

              OLA OBRIGADO, MAS ACREDITO QUE DEVO ESTAR FAZENDO ALGO ERRADO, TENS COMO ME AJUDAR ??? SEGUE

              DECLARE

              ‘&&v_periodo_01’ DATE;

              BEGIN

              select

              sum (case when(r034fun.datadm <= (DATE) and exists(select 1
              from vetorh.r038hfi
              where r038hfi.numemp = r034fun.numemp
              and r038hfi.tipcol = r034fun.tipcol
              and r038hfi.numcad = r034fun.numcad
              and r038hfi.datalt <= (DATE))
              and not exists (select 1

                from vetorh.r038afa 
                   where r038afa.numemp = r034fun.numemp 
                       and r038afa.tipcol = r034fun.tipcol 
                         and r038afa.numcad = r034fun.numcad 
                           and r038afa.datafa = (select max(r038afa.datafa) 
              
                from vetorh.r038afa, vetorh.r010sit 
                   where r038afa.numemp = r034fun.numemp 
                       and r038afa.tipcol = r034fun.tipcol 
                         and r038afa.numcad = r034fun.numcad 
                           and r038afa.datafa &lt;= (DATE) 
                             and r038afa.sitafa = r010sit.codsit 
                               and r010sit.tipsit = 7))
                                 and r038hsa.datalt = (select max (datalt) 
              
                from vetorh.r038hsa tab3 
                   where tab3.numemp = r038hsa.numemp
                       and tab3.tipcol = r038hsa.tipcol 
                         and tab3.numcad = r038hsa.numcad 
                           and tab3.datalt &lt;= DATE)
                             and r038hsa.valsal = (select max (valsal) 
              
                from vetorh.r038hsa tab4 
                   where tab4.numemp = r038hsa.numemp 
                       and tab4.tipcol = r038hsa.tipcol 
                         and tab4.numcad = r038hsa.numcad 
                           and tab4.datalt &lt;= DATE))
              
                then (r038hsa.valsal) end)
              
                from vetorh.r034fun,
                     vetorh.r016hie,
                     vetorh.r010sit,
                     vetorh.r038hsa,
                     vetorh.r016orn
              
                   where r034fun.sitafa = r010sit.codsit 
                       and r034fun.taborg = r016orn.taborg 
                         and r034fun.numloc = r016orn.numloc 
                           and r016hie.taborg = r016orn.taborg 
                             and r016hie.numloc = r016orn.numloc 
                               and r038hsa.numemp = r034fun.numemp 
                                 and r038hsa.tipcol = r034fun.tipcol 
                                   and r038hsa.numcad = r034fun.numcad 
                                     and r034fun.numemp in (1,2) 
                                       and r034fun.tipcol = 1
                                         and r034fun.tipcon = 1
              

              END;

              [quote="leo_jf":17umn5ad]Olas,

              Acho que fica mais facil transformar em um bloco anônimo, e usar as variaveis que assim vc não se perde. Para saida dos dados geralmente uso o utl_file.

              Ou se achar complicado, faça com o Ishii falou que é bem legal também.
              P.s: Usa o plsdeveloper (RAD), que ajuda bem.

              DECLARE

              v_periodo_01 DATE;
              v_periodo_02 DATE;
              .
              .
              .

              BEGIN

              sua_query;

              END;

              Espero que ajude.
              []s[/quote]

              #87740
              Ishii
              Participante

                Olá,

                Você vai chamar esta procedure? Ou ela é que tem que te pedir cinco vezes o parâmetro data?

                Se for você a chamar a proc… acho melhor chamar cinco vezes mesmo, se não for voce, terá que ser conforme a exemplo do Leo mesmo.

                Especifique melhor para nós, assim fica mais fácil entender…

                []s Ishii
                [/code]

                #87742
                Miro
                Participante

                  sim, eu preciso que o script me peça 5 datas diferentes

                  [quote=”Ishii”:1w82hnq7]Olá,

                  Você vai chamar esta procedure? Ou ela é que tem que te pedir cinco vezes o parâmetro data?

                  Se for você a chamar a proc… acho melhor chamar cinco vezes mesmo, se não for voce, terá que ser conforme a exemplo do Leo mesmo.

                  Especifique melhor para nós, assim fica mais fácil entender…

                  []s Ishii
                  [/code][/quote]

                  #87743
                  Ishii
                  Participante

                    Olá,

                    Melhor fazer uma procedure então, pois somente no script do SQL isso seria melhor ser chamado 5 vezes….

                    []s Ishii

                    #87744
                    Miro
                    Participante

                      vc tem como montar um exemplo com 5 chamadas ????
                      DECLARE

                      ????????

                      BEGIN

                      select

                      sum (case when(r034fun.datadm <= (DATE) and exists(select 1
                      from vetorh.r038hfi
                      where r038hfi.numemp = r034fun.numemp
                      and r038hfi.tipcol = r034fun.tipcol
                      and r038hfi.numcad = r034fun.numcad
                      and r038hfi.datalt <= (DATE))
                      and not exists (select 1

                        from vetorh.r038afa 
                           where r038afa.numemp = r034fun.numemp 
                               and r038afa.tipcol = r034fun.tipcol 
                                 and r038afa.numcad = r034fun.numcad 
                                   and r038afa.datafa = (select max(r038afa.datafa) 
                      
                        from vetorh.r038afa, vetorh.r010sit 
                           where r038afa.numemp = r034fun.numemp 
                               and r038afa.tipcol = r034fun.tipcol 
                                 and r038afa.numcad = r034fun.numcad 
                                   and r038afa.datafa &lt;= (DATE) 
                                     and r038afa.sitafa = r010sit.codsit 
                                       and r010sit.tipsit = 7))
                                         and r038hsa.datalt = (select max (datalt) 
                      
                        from vetorh.r038hsa tab3 
                           where tab3.numemp = r038hsa.numemp
                               and tab3.tipcol = r038hsa.tipcol 
                                 and tab3.numcad = r038hsa.numcad 
                                   and tab3.datalt &lt;= DATE)
                                     and r038hsa.valsal = (select max (valsal) 
                      
                        from vetorh.r038hsa tab4 
                           where tab4.numemp = r038hsa.numemp 
                               and tab4.tipcol = r038hsa.tipcol 
                                 and tab4.numcad = r038hsa.numcad 
                                   and tab4.datalt &lt;= DATE))
                      
                        then (r038hsa.valsal) end)
                      
                        from vetorh.r034fun,
                             vetorh.r016hie,
                             vetorh.r010sit,
                             vetorh.r038hsa,
                             vetorh.r016orn
                      
                           where r034fun.sitafa = r010sit.codsit 
                               and r034fun.taborg = r016orn.taborg 
                                 and r034fun.numloc = r016orn.numloc 
                                   and r016hie.taborg = r016orn.taborg 
                                     and r016hie.numloc = r016orn.numloc 
                                       and r038hsa.numemp = r034fun.numemp 
                                         and r038hsa.tipcol = r034fun.tipcol 
                                           and r038hsa.numcad = r034fun.numcad 
                                             and r034fun.numemp in (1,2) 
                                               and r034fun.tipcol = 1
                                                 and r034fun.tipcon = 1
                      

                      END;

                      [quote="Ishii":4mq9em0q]Olá,

                      Melhor fazer uma procedure então, pois somente no script do SQL isso seria melhor ser chamado 5 vezes….

                      []s Ishii[/quote]

                      #87746
                      leo_jf
                      Participante

                        Miro,

                        Fiz um exemplo como teste aqui e ta ok.
                        Veja se consegue ai.
                        Se conseguir, avisa.
                        []s


                        DECLARE
                        /*


                        Analista de Sistemas : Leonardo Novais
                        Analista De Negócios : xxx
                        Data Criação : xxx
                        Funcionalidade : xxx


                        /
                        /
                        Variáveis para processamento dos dados */

                        v_dt_01 DATE := TO_DATE('01/07/2009','DD/MM/YYYY');
                        v_dt_02 DATE := TO_DATE('02/07/2009','DD/MM/YYYY');
                        v_dt_03 DATE := TO_DATE('03/07/2009','DD/MM/YYYY');
                        v_dt_04 DATE := TO_DATE('04/07/2009','DD/MM/YYYY');
                        v_dt_05 DATE := TO_DATE('05/07/2009','DD/MM/YYYY');

                        /Area de contexto principal que irá buscar os dados/

                        CURSOR c_Principal_Miro IS

                        SELECT
                        SELECT /*+ all_rows */ SUM
                        (CASE
                        WHEN (r034fun.datadm <= (v_dt_01)
                        AND EXISTS (
                        SELECT 1
                        FROM vetorh.r038hfi
                        WHERE r038hfi.numemp = r034fun.numemp
                        AND r038hfi.tipcol = r034fun.tipcol
                        AND r038hfi.numcad = r034fun.numcad
                        AND r038hfi.datalt <= (v_dt_02))
                        AND NOT EXISTS (
                        SELECT 1
                        FROM vetorh.r038afa
                        WHERE r038afa.numemp = r034fun.numemp
                        AND r038afa.tipcol = r034fun.tipcol
                        AND r038afa.numcad = r034fun.numcad
                        AND r038afa.datafa =
                        (SELECT MAX (r038afa.datafa)
                        FROM vetorh.r038afa, vetorh.r010sit
                        WHERE r038afa.numemp = r034fun.numemp
                        AND r038afa.tipcol = r034fun.tipcol
                        AND r038afa.numcad = r034fun.numcad
                        AND r038afa.datafa <= (v_dt_03)
                        AND r038afa.sitafa = r010sit.codsit
                        AND r010sit.tipsit = 7))
                        AND r038hsa.datalt =
                        (SELECT MAX (datalt)
                        FROM vetorh.r038hsa tab3
                        WHERE tab3.numemp = r038hsa.numemp
                        AND tab3.tipcol = r038hsa.tipcol
                        AND tab3.numcad = r038hsa.numcad
                        AND tab3.datalt <= v_dt_04)
                        AND r038hsa.valsal =
                        (SELECT MAX (valsal)
                        FROM vetorh.r038hsa tab4
                        WHERE tab4.numemp = r038hsa.numemp
                        AND tab4.tipcol = r038hsa.tipcol
                        AND tab4.numcad = r038hsa.numcad
                        AND tab4.datalt <= v_dt_05)
                        )
                        THEN (r038hsa.valsal)
                        END
                        ) resultado
                        FROM vetorh.r034fun,
                        vetorh.r016hie,
                        vetorh.r010sit,
                        vetorh.r038hsa,
                        vetorh.r016orn
                        WHERE r034fun.sitafa = r010sit.codsit
                        AND r034fun.taborg = r016orn.taborg
                        AND r034fun.numloc = r016orn.numloc
                        AND r016hie.taborg = r016orn.taborg
                        AND r016hie.numloc = r016orn.numloc
                        AND r038hsa.numemp = r034fun.numemp
                        AND r038hsa.tipcol = r034fun.tipcol
                        AND r038hsa.numcad = r034fun.numcad
                        AND r034fun.numemp IN (1, 2)
                        AND r034fun.tipcol = 1
                        AND r034fun.tipcon = 1;

                        BEGIN

                        EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY"';

                        DBMS_OUTPUT.ENABLE(2000000);

                        --Area do Unix que irá gravar o arquivo txt com a saida dos dados
                        v_diretorio := '/diretorio/diretorio2';

                        --Nome do arquivo que sera gerado.
                        v_out := 'Miro_' || TO_CHAR(SYSDATE, 'YYYYMMDD') || '.txt';
                        v_arq := UTL_FILE.FOPEN(v_diretorio, v_out, 'W');

                        --Abre o cursor para processamento
                        FOR reg_Principal_Miro IN c_Principal_Miro LOOP

                        v_line := RPAD(reg_Principal_Miro.resultado, 50);

                        UTL_FILE.PUT_LINE(v_arq, v_line);

                        END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro

                        UTL_FILE.FCLOSE(v_arq);

                        --Tratamento das exceções, caso ocorram.

                        EXCEPTION
                        
                            WHEN UTL_FILE.INVALID_PATH THEN
                                DBMS_OUTPUT.PUT_LINE('Caminho inválido para gravação do arquivo *.txt');
                                UTL_FILE.FCLOSE(v_arq);
                        
                            WHEN UTL_FILE.READ_ERROR THEN
                                DBMS_OUTPUT.PUT_LINE('Erro durante a leitura.');
                                UTL_FILE.FCLOSE(v_arq);
                        
                            WHEN UTL_FILE.WRITE_ERROR THEN
                                DBMS_OUTPUT.PUT_LINE('Erro durante a escrita.');
                                UTL_FILE.FCLOSE(v_arq);
                        
                            WHEN UTL_FILE.ACCESS_DENIED THEN
                                DBMS_OUTPUT.PUT_LINE('Acesso ao arquivo negado - Consultar privilégios.');
                                UTL_FILE.FCLOSE(v_arq);
                        
                            WHEN UTL_FILE.FILE_OPEN THEN
                                DBMS_OUTPUT.PUT_LINE('Arquivo já esta aberto para processamento.');
                                UTL_FILE.FCLOSE(v_arq);
                        
                            WHEN UTL_FILE.INVALID_MAXLINESIZE THEN
                                DBMS_OUTPUT.PUT_LINE('Limite de linha excedeu os 32K - Consultar DBA.');
                                UTL_FILE.FCLOSE(v_arq);
                        
                            WHEN UTL_FILE.INTERNAL_ERROR THEN
                                DBMS_OUTPUT.PUT_LINE('Erro interno do Oracle.');
                                UTL_FILE.FCLOSE(v_arq);  
                        
                            WHEN OTHERS THEN
                                DBMS_OUTPUT.PUT_LINE('Erro não tratado.Consultar Analista Responsável ' || 
                                TRANSLATE(SUBSTR(SQLERRM,1,100),'()','  '));
                                UTL_FILE.FCLOSE(v_arq);
                        

                        END;
                        /
                        EXIT;

                        #87747
                        Miro
                        Participante

                          vc colocou no script em cada seção uma data mas é a mesma data em todas so que quero rode a primeira data mostre o resultado, rode a segunda data e mostre o resultada e assim por diante

                          [quote=”leo_jf”:305pc76g]Miro,
                          1
                          Fiz um exemplo como teste aqui e ta ok.
                          Veja se consegue ai.
                          Se conseguir, avisa.
                          []s


                          DECLARE
                          /*


                          Analista de Sistemas : Leonardo Novais
                          Analista De Negócios : xxx
                          Data Criação : xxx
                          Funcionalidade : xxx


                          /
                          /
                          Variáveis para processamento dos dados */

                          v_dt_01 DATE := TO_DATE('01/07/2009','DD/MM/YYYY');
                          v_dt_02 DATE := TO_DATE('02/07/2009','DD/MM/YYYY');
                          v_dt_03 DATE := TO_DATE('03/07/2009','DD/MM/YYYY');
                          v_dt_04 DATE := TO_DATE('04/07/2009','DD/MM/YYYY');
                          v_dt_05 DATE := TO_DATE('05/07/2009','DD/MM/YYYY');

                          /Area de contexto principal que irá buscar os dados/

                          CURSOR c_Principal_Miro IS

                          SELECT
                          SELECT /*+ all_rows */ SUM
                          (CASE
                          WHEN (r034fun.datadm <= (v_dt_01)
                          AND EXISTS (
                          SELECT 1
                          FROM vetorh.r038hfi
                          WHERE r038hfi.numemp = r034fun.numemp
                          AND r038hfi.tipcol = r034fun.tipcol
                          AND r038hfi.numcad = r034fun.numcad
                          AND r038hfi.datalt <= (v_dt_02))
                          AND NOT EXISTS (
                          SELECT 1
                          FROM vetorh.r038afa
                          WHERE r038afa.numemp = r034fun.numemp
                          AND r038afa.tipcol = r034fun.tipcol
                          AND r038afa.numcad = r034fun.numcad
                          AND r038afa.datafa =
                          (SELECT MAX (r038afa.datafa)
                          FROM vetorh.r038afa, vetorh.r010sit
                          WHERE r038afa.numemp = r034fun.numemp
                          AND r038afa.tipcol = r034fun.tipcol
                          AND r038afa.numcad = r034fun.numcad
                          AND r038afa.datafa <= (v_dt_03)
                          AND r038afa.sitafa = r010sit.codsit
                          AND r010sit.tipsit = 7))
                          AND r038hsa.datalt =
                          (SELECT MAX (datalt)
                          FROM vetorh.r038hsa tab3
                          WHERE tab3.numemp = r038hsa.numemp
                          AND tab3.tipcol = r038hsa.tipcol
                          AND tab3.numcad = r038hsa.numcad
                          AND tab3.datalt <= v_dt_04)
                          AND r038hsa.valsal =
                          (SELECT MAX (valsal)
                          FROM vetorh.r038hsa tab4
                          WHERE tab4.numemp = r038hsa.numemp
                          AND tab4.tipcol = r038hsa.tipcol
                          AND tab4.numcad = r038hsa.numcad
                          AND tab4.datalt <= v_dt_05)
                          )
                          THEN (r038hsa.valsal)
                          END
                          ) resultado
                          FROM vetorh.r034fun,
                          vetorh.r016hie,
                          vetorh.r010sit,
                          vetorh.r038hsa,
                          vetorh.r016orn
                          WHERE r034fun.sitafa = r010sit.codsit
                          AND r034fun.taborg = r016orn.taborg
                          AND r034fun.numloc = r016orn.numloc
                          AND r016hie.taborg = r016orn.taborg
                          AND r016hie.numloc = r016orn.numloc
                          AND r038hsa.numemp = r034fun.numemp
                          AND r038hsa.tipcol = r034fun.tipcol
                          AND r038hsa.numcad = r034fun.numcad
                          AND r034fun.numemp IN (1, 2)
                          AND r034fun.tipcol = 1
                          AND r034fun.tipcon = 1;

                          BEGIN

                          EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY"';

                          DBMS_OUTPUT.ENABLE(2000000);

                          --Area do Unix que irá gravar o arquivo txt com a saida dos dados
                          v_diretorio := '/diretorio/diretorio2';

                          --Nome do arquivo que sera gerado.
                          v_out := 'Miro_' || TO_CHAR(SYSDATE, 'YYYYMMDD') || '.txt';
                          v_arq := UTL_FILE.FOPEN(v_diretorio, v_out, 'W');

                          --Abre o cursor para processamento
                          FOR reg_Principal_Miro IN c_Principal_Miro LOOP

                          v_line := RPAD(reg_Principal_Miro.resultado, 50);

                          UTL_FILE.PUT_LINE(v_arq, v_line);

                          END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro

                          UTL_FILE.FCLOSE(v_arq);

                          --Tratamento das exceções, caso ocorram.

                          EXCEPTION
                          
                              WHEN UTL_FILE.INVALID_PATH THEN
                                  DBMS_OUTPUT.PUT_LINE('Caminho inválido para gravação do arquivo *.txt');
                                  UTL_FILE.FCLOSE(v_arq);
                          
                              WHEN UTL_FILE.READ_ERROR THEN
                                  DBMS_OUTPUT.PUT_LINE('Erro durante a leitura.');
                                  UTL_FILE.FCLOSE(v_arq);
                          
                              WHEN UTL_FILE.WRITE_ERROR THEN
                                  DBMS_OUTPUT.PUT_LINE('Erro durante a escrita.');
                                  UTL_FILE.FCLOSE(v_arq);
                          
                              WHEN UTL_FILE.ACCESS_DENIED THEN
                                  DBMS_OUTPUT.PUT_LINE('Acesso ao arquivo negado - Consultar privilégios.');
                                  UTL_FILE.FCLOSE(v_arq);
                          
                              WHEN UTL_FILE.FILE_OPEN THEN
                                  DBMS_OUTPUT.PUT_LINE('Arquivo já esta aberto para processamento.');
                                  UTL_FILE.FCLOSE(v_arq);
                          
                              WHEN UTL_FILE.INVALID_MAXLINESIZE THEN
                                  DBMS_OUTPUT.PUT_LINE('Limite de linha excedeu os 32K - Consultar DBA.');
                                  UTL_FILE.FCLOSE(v_arq);
                          
                              WHEN UTL_FILE.INTERNAL_ERROR THEN
                                  DBMS_OUTPUT.PUT_LINE('Erro interno do Oracle.');
                                  UTL_FILE.FCLOSE(v_arq);  
                          
                              WHEN OTHERS THEN
                                  DBMS_OUTPUT.PUT_LINE('Erro não tratado.Consultar Analista Responsável ' || 
                                  TRANSLATE(SUBSTR(SQLERRM,1,100),'()','  '));
                                  UTL_FILE.FCLOSE(v_arq);
                          

                          END;
                          /
                          EXIT;
                          [/quote]

                          #87749
                          leo_jf
                          Participante

                            Saquei.Mas é fácil!!!
                            O jeito mais facil seria você abrir o for… n vezes que quiser. Fixar a data para cada For ( como o For abre e fecha internamente vc nao precisa se preocupar).
                            Testei aqui e funcionou, mas com certeza não é o melhor jeito para fazer.
                            Segue, veja se consegue.
                            Lembrar que você só ira fechar o utl_file uma única vez para ser gerado apenas um arquivo com tantas linhas forem necessárias de cada cursor.

                            DECLARE
                            /*


                            Analista de Sistemas : Leonardo Novais
                            Analista De Negócios : xxx
                            Data Criação : xxx
                            Funcionalidade : xxx


                            /
                            /
                            Variáveis para processamento dos dados */

                            v_dt DATE;

                            /Area de contexto principal que irá buscar os dados/

                            CURSOR c_Principal_Miro IS

                            SELECT
                            SELECT /*+ all_rows */ SUM
                            (CASE
                            WHEN (r034fun.datadm <= (v_dt)
                            AND EXISTS (
                            SELECT 1
                            FROM vetorh.r038hfi
                            WHERE r038hfi.numemp = r034fun.numemp
                            AND r038hfi.tipcol = r034fun.tipcol
                            AND r038hfi.numcad = r034fun.numcad
                            AND r038hfi.datalt <= (v_dt))
                            AND NOT EXISTS (
                            SELECT 1
                            FROM vetorh.r038afa
                            WHERE r038afa.numemp = r034fun.numemp
                            AND r038afa.tipcol = r034fun.tipcol
                            AND r038afa.numcad = r034fun.numcad
                            AND r038afa.datafa =
                            (SELECT MAX (r038afa.datafa)
                            FROM vetorh.r038afa, vetorh.r010sit
                            WHERE r038afa.numemp = r034fun.numemp
                            AND r038afa.tipcol = r034fun.tipcol
                            AND r038afa.numcad = r034fun.numcad
                            AND r038afa.datafa <= (v_dt)
                            AND r038afa.sitafa = r010sit.codsit
                            AND r010sit.tipsit = 7))
                            AND r038hsa.datalt =
                            (SELECT MAX (datalt)
                            FROM vetorh.r038hsa tab3
                            WHERE tab3.numemp = r038hsa.numemp
                            AND tab3.tipcol = r038hsa.tipcol
                            AND tab3.numcad = r038hsa.numcad
                            AND tab3.datalt <= v_dt)
                            AND r038hsa.valsal =
                            (SELECT MAX (valsal)
                            FROM vetorh.r038hsa tab4
                            WHERE tab4.numemp = r038hsa.numemp
                            AND tab4.tipcol = r038hsa.tipcol
                            AND tab4.numcad = r038hsa.numcad
                            AND tab4.datalt <= v_dt)
                            )
                            THEN (r038hsa.valsal)
                            END
                            ) resultado
                            FROM vetorh.r034fun,
                            vetorh.r016hie,
                            vetorh.r010sit,
                            vetorh.r038hsa,
                            vetorh.r016orn
                            WHERE r034fun.sitafa = r010sit.codsit
                            AND r034fun.taborg = r016orn.taborg
                            AND r034fun.numloc = r016orn.numloc
                            AND r016hie.taborg = r016orn.taborg
                            AND r016hie.numloc = r016orn.numloc
                            AND r038hsa.numemp = r034fun.numemp
                            AND r038hsa.tipcol = r034fun.tipcol
                            AND r038hsa.numcad = r034fun.numcad
                            AND r034fun.numemp IN (1, 2)
                            AND r034fun.tipcol = 1
                            AND r034fun.tipcon = 1;

                            BEGIN

                            EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY"';

                            DBMS_OUTPUT.ENABLE(2000000);

                            --Area do Unix que irá gravar o arquivo txt com a saida dos dados
                            v_diretorio := '/diretorio/diretorio2';

                            --Nome do arquivo que sera gerado.
                            v_out := 'Miro_' || TO_CHAR(SYSDATE, 'YYYYMMDD') || '.txt';
                            v_arq := UTL_FILE.FOPEN(v_diretorio, v_out, 'W');

                            --Abre o cursor para processamento

                            FOR reg_Principal_Miro IN c_Principal_Miro LOOP

                            v_dt := TO_DATE('01/07/2009','DD/MM/YYYY');

                            v_line := RPAD(reg_Principal_Miro.resultado, 50);

                            UTL_FILE.PUT_LINE(v_arq, v_line);

                            END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro

                            FOR reg_Principal_Miro IN c_Principal_Miro LOOP

                            v_dt := TO_DATE('02/07/2009','DD/MM/YYYY');

                            v_line := RPAD(reg_Principal_Miro.resultado, 50);

                            UTL_FILE.PUT_LINE(v_arq, v_line);

                            END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro

                            FOR reg_Principal_Miro IN c_Principal_Miro LOOP

                            v_dt := TO_DATE('03/07/2009','DD/MM/YYYY');

                            v_line := RPAD(reg_Principal_Miro.resultado, 50);

                            UTL_FILE.PUT_LINE(v_arq, v_line);

                            END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro

                            FOR reg_Principal_Miro IN c_Principal_Miro LOOP

                            v_dt := TO_DATE('04/07/2009','DD/MM/YYYY');

                            v_line := RPAD(reg_Principal_Miro.resultado, 50);

                            UTL_FILE.PUT_LINE(v_arq, v_line);

                            END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro

                            UTL_FILE.FCLOSE(v_arq);

                            --Tratamento das exceções, caso ocorram.

                            EXCEPTION
                            
                                WHEN UTL_FILE.INVALID_PATH THEN
                                    DBMS_OUTPUT.PUT_LINE('Caminho inválido para gravação do arquivo *.txt');
                                    UTL_FILE.FCLOSE(v_arq);
                            
                                WHEN UTL_FILE.READ_ERROR THEN
                                    DBMS_OUTPUT.PUT_LINE('Erro durante a leitura.');
                                    UTL_FILE.FCLOSE(v_arq);
                            
                                WHEN UTL_FILE.WRITE_ERROR THEN
                                    DBMS_OUTPUT.PUT_LINE('Erro durante a escrita.');
                                    UTL_FILE.FCLOSE(v_arq);
                            
                                WHEN UTL_FILE.ACCESS_DENIED THEN
                                    DBMS_OUTPUT.PUT_LINE('Acesso ao arquivo negado - Consultar privilégios.');
                                    UTL_FILE.FCLOSE(v_arq);
                            
                                WHEN UTL_FILE.FILE_OPEN THEN
                                    DBMS_OUTPUT.PUT_LINE('Arquivo já esta aberto para processamento.');
                                    UTL_FILE.FCLOSE(v_arq);
                            
                                WHEN UTL_FILE.INVALID_MAXLINESIZE THEN
                                    DBMS_OUTPUT.PUT_LINE('Limite de linha excedeu os 32K - Consultar DBA.');
                                    UTL_FILE.FCLOSE(v_arq);
                            
                                WHEN UTL_FILE.INTERNAL_ERROR THEN
                                    DBMS_OUTPUT.PUT_LINE('Erro interno do Oracle.');
                                    UTL_FILE.FCLOSE(v_arq);  
                            
                                WHEN OTHERS THEN
                                    DBMS_OUTPUT.PUT_LINE('Erro não tratado.Consultar Analista Responsável ' || 
                                    TRANSLATE(SUBSTR(SQLERRM,1,100),'()','  '));
                                    UTL_FILE.FCLOSE(v_arq);
                            

                            END;
                            /
                            EXIT;

                            #87776
                            Miro
                            Participante

                              certo, mas vc tem como fazer o script sem salvar somente listando em tela ??

                              [quote=”leo_jf”:3infodo0]Saquei.Mas é fácil!!!
                              O jeito mais facil seria você abrir o for… n vezes que quiser. Fixar a data para cada For ( como o For abre e fecha internamente vc nao precisa se preocupar).
                              Testei aqui e funcionou, mas com certeza não é o melhor jeito para fazer.
                              Segue, veja se consegue.
                              Lembrar que você só ira fechar o utl_file uma única vez para ser gerado apenas um arquivo com tantas linhas forem necessárias de cada cursor.

                              DECLARE
                              /*


                              Analista de Sistemas : Leonardo Novais
                              Analista De Negócios : xxx
                              Data Criação : xxx
                              Funcionalidade : xxx


                              /
                              /
                              Variáveis para processamento dos dados */

                              v_dt DATE;

                              /Area de contexto principal que irá buscar os dados/

                              CURSOR c_Principal_Miro IS

                              SELECT
                              SELECT /*+ all_rows */ SUM
                              (CASE
                              WHEN (r034fun.datadm <= (v_dt)
                              AND EXISTS (
                              SELECT 1
                              FROM vetorh.r038hfi
                              WHERE r038hfi.numemp = r034fun.numemp
                              AND r038hfi.tipcol = r034fun.tipcol
                              AND r038hfi.numcad = r034fun.numcad
                              AND r038hfi.datalt <= (v_dt))
                              AND NOT EXISTS (
                              SELECT 1
                              FROM vetorh.r038afa
                              WHERE r038afa.numemp = r034fun.numemp
                              AND r038afa.tipcol = r034fun.tipcol
                              AND r038afa.numcad = r034fun.numcad
                              AND r038afa.datafa =
                              (SELECT MAX (r038afa.datafa)
                              FROM vetorh.r038afa, vetorh.r010sit
                              WHERE r038afa.numemp = r034fun.numemp
                              AND r038afa.tipcol = r034fun.tipcol
                              AND r038afa.numcad = r034fun.numcad
                              AND r038afa.datafa <= (v_dt)
                              AND r038afa.sitafa = r010sit.codsit
                              AND r010sit.tipsit = 7))
                              AND r038hsa.datalt =
                              (SELECT MAX (datalt)
                              FROM vetorh.r038hsa tab3
                              WHERE tab3.numemp = r038hsa.numemp
                              AND tab3.tipcol = r038hsa.tipcol
                              AND tab3.numcad = r038hsa.numcad
                              AND tab3.datalt <= v_dt)
                              AND r038hsa.valsal =
                              (SELECT MAX (valsal)
                              FROM vetorh.r038hsa tab4
                              WHERE tab4.numemp = r038hsa.numemp
                              AND tab4.tipcol = r038hsa.tipcol
                              AND tab4.numcad = r038hsa.numcad
                              AND tab4.datalt <= v_dt)
                              )
                              THEN (r038hsa.valsal)
                              END
                              ) resultado
                              FROM vetorh.r034fun,
                              vetorh.r016hie,
                              vetorh.r010sit,
                              vetorh.r038hsa,
                              vetorh.r016orn
                              WHERE r034fun.sitafa = r010sit.codsit
                              AND r034fun.taborg = r016orn.taborg
                              AND r034fun.numloc = r016orn.numloc
                              AND r016hie.taborg = r016orn.taborg
                              AND r016hie.numloc = r016orn.numloc
                              AND r038hsa.numemp = r034fun.numemp
                              AND r038hsa.tipcol = r034fun.tipcol
                              AND r038hsa.numcad = r034fun.numcad
                              AND r034fun.numemp IN (1, 2)
                              AND r034fun.tipcol = 1
                              AND r034fun.tipcon = 1;

                              BEGIN

                              EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY"';

                              DBMS_OUTPUT.ENABLE(2000000);

                              --Area do Unix que irá gravar o arquivo txt com a saida dos dados
                              v_diretorio := '/diretorio/diretorio2';

                              --Nome do arquivo que sera gerado.
                              v_out := 'Miro_' || TO_CHAR(SYSDATE, 'YYYYMMDD') || '.txt';
                              v_arq := UTL_FILE.FOPEN(v_diretorio, v_out, 'W');

                              --Abre o cursor para processamento

                              FOR reg_Principal_Miro IN c_Principal_Miro LOOP

                              v_dt := TO_DATE('01/07/2009','DD/MM/YYYY');

                              v_line := RPAD(reg_Principal_Miro.resultado, 50);

                              UTL_FILE.PUT_LINE(v_arq, v_line);

                              END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro

                              FOR reg_Principal_Miro IN c_Principal_Miro LOOP

                              v_dt := TO_DATE('02/07/2009','DD/MM/YYYY');

                              v_line := RPAD(reg_Principal_Miro.resultado, 50);

                              UTL_FILE.PUT_LINE(v_arq, v_line);

                              END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro

                              FOR reg_Principal_Miro IN c_Principal_Miro LOOP

                              v_dt := TO_DATE('03/07/2009','DD/MM/YYYY');

                              v_line := RPAD(reg_Principal_Miro.resultado, 50);

                              UTL_FILE.PUT_LINE(v_arq, v_line);

                              END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro

                              FOR reg_Principal_Miro IN c_Principal_Miro LOOP

                              v_dt := TO_DATE('04/07/2009','DD/MM/YYYY');

                              v_line := RPAD(reg_Principal_Miro.resultado, 50);

                              UTL_FILE.PUT_LINE(v_arq, v_line);

                              END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro

                              UTL_FILE.FCLOSE(v_arq);

                              --Tratamento das exceções, caso ocorram.

                              EXCEPTION
                              
                                  WHEN UTL_FILE.INVALID_PATH THEN
                                      DBMS_OUTPUT.PUT_LINE('Caminho inválido para gravação do arquivo *.txt');
                                      UTL_FILE.FCLOSE(v_arq);
                              
                                  WHEN UTL_FILE.READ_ERROR THEN
                                      DBMS_OUTPUT.PUT_LINE('Erro durante a leitura.');
                                      UTL_FILE.FCLOSE(v_arq);
                              
                                  WHEN UTL_FILE.WRITE_ERROR THEN
                                      DBMS_OUTPUT.PUT_LINE('Erro durante a escrita.');
                                      UTL_FILE.FCLOSE(v_arq);
                              
                                  WHEN UTL_FILE.ACCESS_DENIED THEN
                                      DBMS_OUTPUT.PUT_LINE('Acesso ao arquivo negado - Consultar privilégios.');
                                      UTL_FILE.FCLOSE(v_arq);
                              
                                  WHEN UTL_FILE.FILE_OPEN THEN
                                      DBMS_OUTPUT.PUT_LINE('Arquivo já esta aberto para processamento.');
                                      UTL_FILE.FCLOSE(v_arq);
                              
                                  WHEN UTL_FILE.INVALID_MAXLINESIZE THEN
                                      DBMS_OUTPUT.PUT_LINE('Limite de linha excedeu os 32K - Consultar DBA.');
                                      UTL_FILE.FCLOSE(v_arq);
                              
                                  WHEN UTL_FILE.INTERNAL_ERROR THEN
                                      DBMS_OUTPUT.PUT_LINE('Erro interno do Oracle.');
                                      UTL_FILE.FCLOSE(v_arq);  
                              
                                  WHEN OTHERS THEN
                                      DBMS_OUTPUT.PUT_LINE('Erro não tratado.Consultar Analista Responsável ' || 
                                      TRANSLATE(SUBSTR(SQLERRM,1,100),'()','  '));
                                      UTL_FILE.FCLOSE(v_arq);
                              

                              END;
                              /
                              EXIT;
                              [/quote]

                              #87781
                              leo_jf
                              Participante

                                Miro,

                                Teve alguns erros que não percebi no script, quando postei.
                                Peço desculpas a todos pelo erro, que não irá acontecer novamente.
                                Segue erros e correção:

                                1) Faltou as variaveis para geração da saida do arquivo.
                                2) Havia dois selects no cursor
                                3) a variavel v_data deve estar ANTES do LOOP e não dentro, pois dentro não ira buscar as datas diferentes.

                                Segue um teste que fiz e dados que foram gerados. Veja se agora te ajuda ou, se caso já tenha resolvido o problema, por favor, postar.

                                DECLARE

                                v_dt DATE;
                                v_out VARCHAR2(250);
                                v_line VARCHAR2(1000);
                                v_diretorio VARCHAR2(250);
                                v_arq UTL_FILE.FILE_TYPE;

                                CURSOR c_acesso IS

                                SELECT matr, data
                                FROM acesso aces
                                WHERE aces.matr = 99999999
                                AND aces.data = v_dt;

                                BEGIN

                                EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY"';

                                DBMS_OUTPUT.ENABLE(2000000);

                                v_diretorio := '/leonardo/saida';

                                v_out := 'Miro_' || TO_CHAR(SYSDATE, 'YYYYMMDD') || '.txt';
                                v_arq := UTL_FILE.FOPEN(v_diretorio, v_out, 'W');

                                v_dt := TO_DATE('01/07/2009','DD/MM/YYYY');

                                FOR reg_acesso IN c_acesso LOOP

                                v_line := RPAD(reg_acesso.matr, 10) || ' ' ||
                                RPAD(reg_acesso.data, 10);

                                UTL_FILE.PUT_LINE(v_arq, v_line);

                                END LOOP;

                                v_dt := TO_DATE('04/06/2009','DD/MM/YYYY');

                                FOR reg_acesso IN c_acesso LOOP

                                v_line := RPAD(reg_acesso.matr, 10) || ' ' ||
                                RPAD(reg_acesso.data, 10);

                                UTL_FILE.PUT_LINE(v_arq, v_line);

                                END LOOP;

                                UTL_FILE.FCLOSE(v_arq);

                                --Tratamento das exceções, caso ocorram.

                                EXCEPTION 
                                
                                    WHEN UTL_FILE.INVALID_PATH THEN 
                                        DBMS_OUTPUT.PUT_LINE('Caminho inválido para gravação do arquivo *.txt'); 
                                        UTL_FILE.FCLOSE(v_arq); 
                                
                                    WHEN UTL_FILE.READ_ERROR THEN 
                                        DBMS_OUTPUT.PUT_LINE('Erro durante a leitura.'); 
                                        UTL_FILE.FCLOSE(v_arq); 
                                
                                    WHEN UTL_FILE.WRITE_ERROR THEN 
                                        DBMS_OUTPUT.PUT_LINE('Erro durante a escrita.'); 
                                        UTL_FILE.FCLOSE(v_arq); 
                                
                                    WHEN UTL_FILE.ACCESS_DENIED THEN 
                                        DBMS_OUTPUT.PUT_LINE('Acesso ao arquivo negado - Consultar privilégios.'); 
                                        UTL_FILE.FCLOSE(v_arq); 
                                
                                    WHEN UTL_FILE.FILE_OPEN THEN 
                                        DBMS_OUTPUT.PUT_LINE('Arquivo já esta aberto para processamento.'); 
                                        UTL_FILE.FCLOSE(v_arq); 
                                
                                    WHEN UTL_FILE.INVALID_MAXLINESIZE THEN 
                                        DBMS_OUTPUT.PUT_LINE('Limite de linha excedeu os 32K - Consultar DBA.'); 
                                        UTL_FILE.FCLOSE(v_arq); 
                                
                                    WHEN UTL_FILE.INTERNAL_ERROR THEN 
                                        DBMS_OUTPUT.PUT_LINE('Erro interno do Oracle.'); 
                                        UTL_FILE.FCLOSE(v_arq);  
                                
                                    WHEN OTHERS THEN 
                                        DBMS_OUTPUT.PUT_LINE('Erro não tratado.Consultar Analista Responsável ' || 
                                        TRANSLATE(SUBSTR(SQLERRM,1,100),'()','  ')); 
                                        UTL_FILE.FCLOSE(v_arq); 
                                

                                END;

                                Saida gerada:

                                99999999 01/07/2009
                                99999999 04/06/2009

                                Lembrar que o numero de dadas que quiser, vc deve repetir o bloco: “v_data e for”, e que existem outras maneiras melhores para se fazer esse processamento, essa é uma delas ( que não é a melhor, apenas um quebra galho).
                                []s

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