Terminar a execuçao de For Loop

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Marlon Pasquali
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 28
Registrado em: Seg, 20 Mar 2006 3:40 pm
Localização: Erechim - RS

Oi Pessoal, preciso de uma dica de voces.

Tenho um cursor definido e depois estou fazendo um For Loop para ler os dados deste cursor. Como faço para que a partir de uma determinada condiçao de teste eu possa pular para fora deste Loop.

obrigado
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5018
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Simples: EXIT;

Inclusive, se você tiver cursores ou loops aninhados, você pode sair do loop principal direto. Veja o exemplo:

Selecionar tudo

SQL> SELECT COUNT(1) FROM TB_CLIENTE_FIN;

  COUNT(1)
----------
         9

SQL> 
SQL> 
SQL> 
SQL> 
SQL> BEGIN
  2  
  3    <<PRIMEIRO>>
  4    FOR VCUR IN (SELECT ROWNUM A FROM TB_CLIENTE_FIN)
  5    LOOP
  6  
  7      DBMS_OUTPUT.PUT_LINE( VCUR.A );
  8  
  9      <<SEGUNDO>>
 10      FOR VCUR2 IN (SELECT * FROM DUAL)
 11      LOOP
 12        EXIT PRIMEIRO;  --sai do primeiro loop direto!
 13  
 14      END LOOP SEGUNDO;
 15    END LOOP PRIMEIRO;
 16  END;
 17  /
1

PL/SQL procedure successfully completed.

SQL> 
Marlon Pasquali
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 28
Registrado em: Seg, 20 Mar 2006 3:40 pm
Localização: Erechim - RS

Cara me da uma luz ai pois não está funcionando. Olha a PL que eu tenho. Coloquei um If para testar a condiçao e fazer o EXIT, mas ta demorando uma eternidade pra rodar. Oque estou fazendo de errado.

Selecionar tudo

---
--- Seleciona os Cabeçalhos das Notas Fiscais
---

cursor c_notas is
   select  
            ri.invoice_id Nota_id,
            
      from  rec_invoices            ri
      where rec.receive_date between nvl(p_data_inicial, rec.receive_date) and nvl(p_data_final, trunc(sysdate))
      order by 1;
    

---
--- Seleciona os impostos da Nota Fiscal
---
cursor c_impostos is
   select   ri.invoice_id Nota_id,
            sum(ril.icms_base) BaseIcms
            
      from  rec_invoice_lines       ril,
            rec_invoices            ri
      where rec.receive_date between  nvl(p_data_inicial, rec.receive_date) and nvl(p_data_final, trunc(sysdate))
      and   ril.invoice_id = ri.invoice_id
      group by ri.invoice_id
      order by 1;
      


  

BEGIN
   begin
      DBMS_OUTPUT.ENABLE(64000);
      out_file := UTL_FILE.FOPEN(p_diretorio, p_arquivo, va_open_mode);
      EXCEPTION
         WHEN utl_file.invalid_path THEN
            fnd_file.put_line(fnd_file.log, 'Problema na Abertura do Arquivo, Diretório Inválido. DIRETÓRIO: ' || p_diretorio);
            raise_application_error(-20010, 'PROBLEMA NA ABERTURA DO ARQUIVO '||p_arquivo||' . INVALID PATH');
         WHEN utl_file.invalid_mode THEN
            fnd_file.put_line(fnd_file.log, 'Problema na Abertura do Arquivo, Modo Inválido. Modo: ' || va_open_mode);
            raise_application_error(-20020, 'PROBLEMA NA ABERTURA DO ARQUIVO '||p_arquivo||' . INVALID MODE');
         WHEN utl_file.invalid_operation THEN
            fnd_file.put_line(fnd_file.log, 'Problema na Abertura do Arquivo, Operação Inválida. ARQUIVO: ' || p_arquivo);
            raise_application_error(-20030, 'PROBLEMA NA ABERTURA DO ARQUIVO '||p_arquivo||' . INVALID OPERATION');
   end;



   --
   --extração dos dados gerados pelos cursores
   --
   

   -- ( Cabeçalho da Nota Fiscal )
for r_notas in c_notas loop 

         
      linebuf := 'C';
      fnd_file.put_line(fnd_file.output ,linebuf);


           for r_impostos in c_impostos loop --- Impostos da Nota Fiscal 

               if r_impostos.nota_id > r_notas.nota_id then
                   EXIT;
               end if;
               
               if r_impostos.nota_id = r_notas.nota_id then
                 linebuf := 'D';
                 fnd_file.put_line(fnd_file.output ,linebuf);
               end if;   

           end loop;

end loop; 

END;
Marlon Pasquali
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 28
Registrado em: Seg, 20 Mar 2006 3:40 pm
Localização: Erechim - RS

Galera, tem como no For - Loop passar algum parametro para o cursor para que possa colocar na clausula where do Select ?
Avatar do usuário
TBou
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 136
Registrado em: Qui, 05 Ago 2004 9:33 am
Localização: Campo Grande - MS
Thiago Bourscheidt
thiago.info@apoiorural.com.br
Analista de Sistemas

é exatamente isso, o seu codigo esta gerando um produto cartesiano.
para cada volta do seu loop externo esta passando em todas as notas do loop interno.
existe sim como você passar um parametro no cursor

Selecionar tudo

CURSOR CUS_IMPOSTOR (V_NR_NOTA IN NUMBER) IS
SELECT FSJKFHSDFJ
FROM IMPOSTONOTA
WHERE NR_NOTA = V_NR_NOTA;
mas para seu caso como você esta dando SUM(vl_imposto) só irá trazer uma linha para cada nota....neste caso não precisa de um cursor interno...você pode fazer uma select com clausula into.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes