Segue coments : >> ... posteriormente, a instrução WHERE CURRENT OF para q o valor a ser >> aplicado NÃO SEJA somente o do último ponteiro...
reveja o código que vc nos enviou, pois nele ** NÃO ** está o WHERE CURRENT OF, ok ?? > - A ausência do WHERE se dá pelo fato de que todas as linhas da tabela > deverão ser atualizadas. não, colega, não, pelo jeito vc não entendeu, vamos tentar de novo : SEM um WHERE qquer no UPDATE (poderia sim ser o WHERE CURRENT OF), o valor lido/calculado na primeira linha do resultset do seu cursor vai ser gravado EM TODOS OS REGISTROS da sua tabela, de uma vez só, é DUVIDOSO que seja isso que vc quer.... A dedução que faço da sua lógica é que vc quer ler dados da linha 1 do cursor , fazer um cálculo e atualizar ESSA MESMA LINHA 1 apenas com o resultado, depois ler a linha 2 e atualizar APENAS ESSA LINHA 2 com o novo valor, assim por diante, e rigorosamente NÂO É isso que o seu UPDATE sem WHERE faz, yes ?? > - Repassei a instrução de FETCH para dentro do laço de LOOP e a proc > recompilou normalmente... O problema é que, na hora de rodar, ele informa > erro e indica q o cursor já está aberto... Como devo proceder nesses casos? Ao vc fazer um cursor explícito (cursor 'manual'), com OPEN/FETCH/CLOSE, **** necessariamente **** a lógica é : abra UMA VEZ SÓ, repita o FETCH até não haver mais registros (portanto apenas ELE está dentro do laço), e só quando todos foram lidos feche o cursor (portanto o CLOS está FORA do laço, também... Ficaria + ou - assim : create or replace procedure aux.prc_teste_matheus (v_erro out varchar2) is v_rqr number; v_dtf date; --Criando o cursor para atualização da tabela cursor mma_update is select (date_key - rt_qtde_retorno) dt_final from aux.teste_matheus for update; BEGIN --Abrindo o cursor open mma_update; loop --Obtendo os dados do cursor fetch mma_update into v_dtf; --sair quando não houver informações exit when mma_update%notfound; --Atualizando a Tabela a partir dos valores obtidos update aux.teste_matheus set dt_final = v_dtf WHERE CURRENT OF mma_update; end loop; --Fechando cursor close mma_update; --Salvando as informações commit; END; ====>> ululantemente óbvio, já que vc quis (para testes, ok) trabalhar com Cursor, sempre há a figura do cursor IMPLÍCITO (cursor 'automático'), aonde o OPEN/FETCH/CLOSE são feitos pra vc transparentemente, a VARIÁVEL DE RETORNO é criada transparentemente, veja como realmente ficaria mais simples : create or replace procedure aux.prc_teste_matheus_auto (v_erro out varchar2) is BEGIN --Abrindo o cursor for v_dtf in ( select (date_key - rt_qtde_retorno) dt_final, rowid v_row_id from aux.teste_matheus ) loop --Obtendo os dados do cursor --Atualizando a Tabela a partir dos valores obtidos update aux.teste_matheus set dt_final = v_dtf.dt_final WHERE rowid = v_dtf.v_row_id; end loop; commit; END; Os conceitos TODOS que comentei/usei aqui estão muito bem definidos no manual Oracle de PL/SQL, ele deveria ser se já não é a tua fonte principal... []s Chiappa --- Em oracle_br@yahoogrupos.com.br, Matheus Malta de Aguiar <maltamath...@...> escreveu > > Obrigado pessoal pelas dicas... > > Gostaria de comentar algumas sugestões que talvez esclareçam melhor a > pergunta que eu fiz: > > - SIM, o select (que denomina o cursor) retorna dados; > - Eu já realizei o comando UPDATE direto, sem a utilização do cursor... e vi > que realmente ele dava certo.. Quis utilizar o cursor mais para fins > didáticos (treinamento mesmo); > - A ausência do WHERE se dá pelo fato de que todas as linhas da tabela > deverão ser atualizadas. A coluna DT_FINAL foi inserida na tabela após a sua > criação e população. Esse comando eu estou fazendo apenas para fazer um > UPDATE geral utilizando para isso um cursor, com comando FOR UPDATE (na > declaração do cursor) e, posteriormente, a instrução WHERE CURRENT OF para q > o valor a ser aplicado NÃO SEJA somente o do último ponteiro. > - Repassei a instrução de FETCH para dentro do laço de LOOP e a proc > recompilou normalmente... O problema é que, na hora de rodar, ele informa > erro e indica q o cursor já está aberto... Como devo proceder nesses casos? > > O meu editor é o PL/SQL developer v 5. > > Grato! > > Matheus Malta > > > 2009/10/14 Evandro Giachetto <evandrogiache...@...> > > > > > > > E, achei desnecessário comentar alguns possíveis erros em seu código, como > > a > > falta de where na instrução update pois os colegas já os comentaram acima. > > > > De uma boa revisada na proc para ver se esses erros correspondem. > > > > Atenciosamente. > > > > > > Evandro Giachetto > > Oracle Certified Associate > > evan...@... <evandro%40clickinterativa.com.br> > > > > 2009/10/14 Evandro Giachetto > > <evandrogiache...@...<evandrogiachetto%40gmail.com> > > > > > > > > > > Você colocou o Fetch antes da instrução LOOP. > > > > > > Dessa forma, a variável v_dtf recebe apenas o primeiro registro do > > cursor. > > > > > > Tente colocar o fetch dentro de seu laço loop. > > > > > > Att. > > > Evandro Giachetto > > > Oracle Certified Associate > > > evan...@... <evandro%40clickinterativa.com.br> > > > > > > > > > 2009/10/14 Matheus Malta de Aguiar > > > <maltamath...@...<maltamatheus%40gmail.com> > > > > > > > > > > > >> > > >> Galera... > > >> > > >> Estou tentando desenvolver uma proc que tem por objetivo atualizar uma > > >> coluna nova que acaba de ser acrescida na tabela, ou seja, ela (a > > coluna) > > >> econtra-se sem registros. > > >> > > >> No entanto, quando do emprego do cursor (em tempo de execução) eu > > percebo > > >> que a proc está atualizando somente a primeira linha da tabela (ou seja, > > >> somente uma única célula). > > >> > > >> Estou encaminhando a proc... > > >> > > >> Quem puder ajudar, ficarei grato! > > >> > > >> Valew pessoal! > > >> > > >> Matheus Malta > > >> "O certo é certo mesmo q ninguém o faça.. e o errado é errado mesmo q > > todo > > >> mundo faça... Procure fazer o certo para não explicar porque resolveu > > >> fazer > > >> errado.. " > > >> > > >> *PROC* > > >> > > >> create or replace procedure aux.prc_teste_matheus > > >> (v_erro out varchar2) > > >> > > >> is > > >> --/*==================================*/ > > >> --|| PROC DE TESTE || > > >> --||----------------------------------|| > > >> --|| AUTOR: Matheus || > > >> --|| MOTIVO: Treino || > > >> --|| TABELA: aux.teste_matheus || > > >> --/*==================================*/ > > >> > > >> v_rqr number; > > >> v_dtf date; > > >> > > >> --Criando o cursor para atualização da tabela > > >> cursor mma_update is > > >> select (date_key - rt_qtde_retorno) dt_final > > >> from aux.teste_matheus > > >> for update; > > >> > > >> begin > > >> > > >> --Abrindo o cursor > > >> open mma_update; > > >> > > >> --Obtendo os dados do cursor > > >> fetch mma_update into v_dtf; > > >> while mma_update%isopen loop > > >> --Atualizando a Tabela a partir dos valores obtidos > > >> update aux.teste_matheus > > >> set dt_final = v_dtf; > > >> > > >> --sair quando não houver informações > > >> exit loop when mma_update%notfound; > > >> > > >> --end loop; > > >> > > >> --Fechando cursor > > >> close mma_update; > > >> --Salvando as informações > > >> commit; > > >> > > >> -- Tratando os erros > > >> EXCEPTION > > >> > > >> WHEN NO_DATA_FOUND then > > >> v_erro := 'Parâmetro não encontrado!'; > > >> dbms_output.put_line(v_erro); > > >> > > >> WHEN OTHERS THEN > > >> v_erro := 'Procedimento não executado - Erro: '||SQLERRM; > > >> dbms_output.put_line(v_erro); > > >> end; > > >> > > >> [As partes desta mensagem que não continham texto foram removidas] > > >> > > >> > > >> > > > > > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > > > [As partes desta mensagem que não continham texto foram removidas] >