- Este tópico contém 16 respostas, 2 vozes e foi atualizado pela última vez 17 anos, 4 meses atrás por
Anônimo.
-
AutorPosts
-
13 de novembro de 2008 às 8:42 pm #83703
Anônimo
Pessoal, estou fazendo um LOOP exatamente assim, e gostaria de saber se eu coloco o <
> neste lugar para eu forçar a saída lá em baio. OPEN c_lancamento;
FETCH c_lancamento BULK COLLECT INTO v_lancamento LIMIT 500;
<>
FOR indx IN 1.. v_lancamento.COUNT LOOP
BEGIN
.
.
.
.
exit <> 13 de novembro de 2008 às 9:26 pm #83706Leonardo Litz
ParticipanteCleber… este <> esta dentro do loop ou dentro do fetch?
13 de novembro de 2008 às 9:44 pm #83707Anônimo
está exatamente dessa forma que eu coloquei e não se se está no lugar correto;
13 de novembro de 2008 às 9:49 pm #83708Leonardo Litz
ParticipanteCleber, passe o código até o close do fetch….
13 de novembro de 2008 às 10:15 pm #83710Anônimo
OPEN c_lancamento;
FETCH c_lancamento BULK COLLECT INTO v_lancamento LIMIT 500;
<>
FOR indx IN 1.. v_lancamento.COUNT LOOP
BEGIN
.
.
.
OPEN c_item(to_number(v_lancamento(indx).CLCT_NUM_LAN_SAP));
FETCH c_item BULK COLLECT INTO v_item LIMIT 500;
<>
FOR indx IN 1.. v_item.COUNT LOOP
BEGIN
.
.
IF c_item%NOTFOUND THEN
EXIT C_1; –sai do primeiro loop direto!
END IF;END; END LOOP; -- END LOOP DE ITENS CLOSE c_item; COMMIT;END LOOP; — end loop de lançamentos
CLOSE c_lancamento;
COMMIT;13 de novembro de 2008 às 10:35 pm #83713Leonardo Litz
ParticipanteCara, ai ele não vai sair do primeiro loop não… oque vc pode fazer
é colocar este bloco nomeado fora do primeiro loop, lá no final, e dar um goto para ele, só que vc saindo desse loop principal, não esqueca de fechar os cursores que estão abertofaca algo do tipo
IF c_item%NOTFOUND THENCLOSE c_lancamento;
CLOSE c_item;
GOTO C_1; –sai do primeiro loop direto!END IF;
Valeu
13 de novembro de 2008 às 10:48 pm #83714Anônimo
o GOTO ele vai voltar ao início no primeiro loop. e eu preciso do segundo loop dentro do primeiro.
13 de novembro de 2008 às 10:55 pm #83715Leonardo Litz
ParticipanteColoca esse <> por ultimo depois do comit e tire o que esta em cima.
13 de novembro de 2008 às 11:01 pm #83716Anônimo
e no lugar do exit eu coloco GOTO?
ficando assim: GOTO <>
13 de novembro de 2008 às 11:08 pm #83717Leonardo Litz
ParticipantePõe assim
IF c_item%NOTFOUND THEN
CLOSE c_lancamento;
CLOSE c_item;
GOTO C_1; –sai do primeiro loop direto!END IF;
13 de novembro de 2008 às 11:14 pm #83718Anônimo
e o programa segue, né?
13 de novembro de 2008 às 11:18 pm #83719Leonardo Litz
ParticipanteIsso, mas coloque no fim (depois do commit) o bloco <>
13 de novembro de 2008 às 11:20 pm #83720Anônimo
cara, me dá uma luz aí numa coisa banal.
eu fiz um loop e fui inserindo em uma tabela, derrepente deu um erro qualquer e preciso deletar esses registros que foram inserido. não posso fazer rollback, apesar de que não dei o commit ainda neste momento.
tem uma idéia aí?
13 de novembro de 2008 às 11:27 pm #83721Leonardo Litz
ParticipanteSeguinte, se vc não deu commit, não precisa deletar os registros pois eles não foram inseridos.
Os erros do oracle contem rollback implicito, ou seja quando ocorre um erro ele ja faz rollback.Nesse seu programa aconselharia vc colocar o commit por ultimo de tudo.
Assim vc garante que se o processo for executado todo belezinha ele estara ok.
Isso é um conceito chamado atomicidade…
Vlw Leonardo Litz
13 de novembro de 2008 às 11:42 pm #83722Anônimo
bem lembrado meu camarada, valeu mesmo!
outra coisa, em um outro processo aqui eu commito a cada 10000 registros inseridos, se derrepente dá um erro qualquer quando ele estiver inserindo 1000 registro então eu perco esses 1000 registros? como fazer para eu nao perder esses 1000 registros? -
AutorPosts
- Você deve fazer login para responder a este tópico.