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]
>


Responder a