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
Terminar a execuçao de For Loop
-
- Rank: Programador Júnior
- Mensagens: 28
- Registrado em: Seg, 20 Mar 2006 3:40 pm
- Localização: Erechim - RS
- dr_gori
- 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
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:
Inclusive, se você tiver cursores ou loops aninhados, você pode sair do loop principal direto. Veja o exemplo:
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>
-
- 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.
---
--- 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;
-
- 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 ?
- TBou
- Rank: Analista Sênior
- Mensagens: 136
- Registrado em: Qui, 05 Ago 2004 9:33 am
- Localização: Campo Grande - MS
é 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
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.
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
CURSOR CUS_IMPOSTOR (V_NR_NOTA IN NUMBER) IS
SELECT FSJKFHSDFJ
FROM IMPOSTONOTA
WHERE NR_NOTA = V_NR_NOTA;
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes