Olá Roberto, bom dia! Obrigado mesmo pela sua ajuda...
Refiz a procedure de uma outra maneira mas a atualização não foi possível pois o campo que está sendo atualizado é um campo chave primária e (penso eu) na hora de fazer a atualização LINHA A LINHA, uma linha acabou sendo duplicada e a atualização não foi permitida... Tentando fazer da maneira como vc sugeriu, eu criei a tabela a parte (que era o q eu estava tentando evitar) e, quando na execução da proc, ele não inseriu os dados considerando o seguinte erro: SQL> @call_prc_updt_ordem_cadastro_prod BEGIN prc_updt_ordem_cadastro_prod; END; * ERRO na linha 1: ORA-00903: nome de tabela inválido ORA-06512: em "MATHEUS.PRC_UPDT_ORDEM_CADASTRO_PROD", line 10 ORA-06512: em line 1 A procedure ficou com essa especificação: 1 CREATE OR REPLACE PROCEDURE prc_updt_ordem_cadastro_prod 2 IS 3 v_linha number; 4 v_com varchar2(1000); 5 6 7 BEGIN 8 9 EXECUTE IMMEDIATE 'TRUNCATE TABLE t_ordem_cadastro'; 10 EXEUCTE IMMEDIATE 'INSERT INTO TABLE t_ordem_cadastro AS'|| 11 ' SELECT rownum linha, product_id, nome'|| 12 ' FROM products'; 13 14 15 BEGIN 16 17 FOR v_linha in(SELECT linha, rowid FROM t_ordem_cadastro FOR UPDATE) 18 loop 19 20 UPDATE products 21 SET product_id = v_linha.linha 22 WHERE rowid = v_linha.rowid; 23 24 END LOOP; 25 26 COMMIT; 27 28 EXCEPTION 29 30 WHEN OTHERS THEN 31 DBMS_OUTPUT.PUT_LINE(SQLERRM); 32 33 34 END; 35* END prc_updt_ordem_cadastro_prod; Não sei exatamente o que pode estar acontecendo.. De qualquer forma, o objetivo dessa proc (além de ser apenas exercício de aprendizagem e testes) é atualizar o campo PRODUCT_ID para que fique em ordem crescente, já que as linhas não foram gravadas dentro de uma seqüência e, ao efetuar um SELECT * [TABELA], ele traz os resultados fora da ordem... É APENAS isso... De qualquer forma, obrigado pela ajuda... Matheus Malta ----- Original Message ----- From: "Roberto Oshikawa" <rcoshik...@gmail.com> To: <oracle_br@yahoogrupos.com.br> Sent: Tuesday, November 10, 2009 9:39 AM Subject: Re: [oracle_br] Dúvida - Procedure Bom dia, Matheus Desculpe a demora da resposta ontem não tive tempo de me conectar, mas refiz a proc q vc estava com problema e as considerações do alexandre estão corretas, realmente para montar o FOR não dá para utilizar uma tabela que ainda está sendo criada dinamicamente, agora pergunto, para essa proc vc vai estar sempre criando essa tabela será que não valeria a pena vc deixa-la fisicamente criada ? Não sei ao certo o propósito da tabela mas acredito que deve ser para extrair alguma informação e depois queima-la, em todo o caso montei a proc para vc como tendo como base a tabela criada ai sim fica mais fácil para poder trabalhar Não existe mais a criação da tabela O truncate limpa a tabela insere os dados com base na tabela products O Update é feito com base o RowId do registro Espero ter ajudado e desculpa pela demora da resposta, qq dúvida pode ir mandando que vou tentando responder o mais rapido possivel abraços CREATE OR REPLACE PROCEDURE prc_updt_ordem_cadastro_prod IS v_linha number; v_com varchar2(1000); BEGIN execute immediate 'truncate TABLE t_ordem_cadastro'; execute immediate 'insert into TABLE t_ordem_cadastro as SELECT rownum linha, product_id, nome FROM products'; BEGIN FOR v_linha in (SELECT linha,rowid FROM t_ordem_cadastro FOR UPDATE) loop UPDATE products SET product_id = v_linha.linha WHERE rowid = v_linha.rowid; End loop; COMMIT; end; END prc_updt_ordem_cadastro_prod; 2009/11/10 Alexandre Campos Moretti <alexcmore...@yahoo.com.br> > > > Ola Roberto, > > Bom dia > > Realmente a solução não vai funcionar porque a tabela que está sendo criada > não existe. > > Existem duas soluções : > > 1) Criar a tabela como temporary table. > > 2) Não criar a tabela auxiliar e colocar o select do for em um cursor. > Veja que você pode dar select na tabela e atualiza-la que o resultado não é > alterado antes do commit. > > De: oracle_br@yahoogrupos.com.br <oracle_br%40yahoogrupos.com.br> [mailto: > oracle_br@yahoogrupos.com.br <oracle_br%40yahoogrupos.com.br>] Em > nome de Matheus Malta > Enviada em: segunda-feira, 9 de novembro de 2009 17:32 > Para: oracle_br@yahoogrupos.com.br <oracle_br%40yahoogrupos.com.br> > Assunto: Re: [oracle_br] Dúvida - Procedure > > > Olá Roberto, boa tarde! > > Obrigado pela ajuda, mas infelizmente não deu certo também... > > Segue abaixo os erros informados pelo Oracle: > > Erros para PROCEDURE PRC_UPDT_ORDEM_CADASTRO_PROD: > > LINE/COL ERROR > -------- ---------------------------------------------------------- > 15/1 PL/SQL: SQL Statement ignored > 16/6 PL/SQL: ORA-00942: a tabela ou view não existe > 24/4 PL/SQL: SQL Statement ignored > 25/21 PL/SQL: ORA-00904: : identificador inválido > 25/21 PLS-00364: o uso da variável 'VERIFICA_ORDEM' de índice de loop é > inválido > > 34/4 PL/SQL: Statement ignored > 34/14 PLS-00364: o uso da variável 'VERIFICA_ORDEM' de índice de loop é > inválido > > Existe alguma sintaxe diferente para fazer um BEGIN dentro do outro, ou > seja, para criação de sub-blocos? > > Seria esse o problema realmente? > > Vlw... > > Matheus Malta > ----- Original Message ----- > From: "Roberto Oshikawa" <rcoshik...@gmail.com <rcoshikava%40gmail.com> > <mailto:rcoshikava%40gmail.com <rcoshikava%2540gmail.com>> > > To: <oracle_br@yahoogrupos.com.br <oracle_br%40yahoogrupos.com.br><mailto: > oracle_br%40yahoogrupos.com.br <oracle_br%2540yahoogrupos.com.br>> > > Sent: Monday, November 09, 2009 4:54 PM > Subject: Re: [oracle_br] Dúvida - Procedure > > o que está acontecendo é que a declaração do cursor tem que ficar antes do > BEGIN, como nesse caso vc está criando dinamicamente entao o correto seria > mudar a forma como vc utiliza o cursor de explicito para implicito, parece > complicado mas é bem mais fácil, segue no seu exemplo mesmo. > > tenta ver dessa forma, vou ficar off por algum tempo, tenta assim se der > algum erro manda pra mim novamente que tento te ajudar depois das 18:00hs, > OK ? > > CREATE OR REPLACE PROCEDURE prc_updt_ordem_cadastro_prod > IS > v_linha number; > v_com varchar2(1000); > > BEGIN > > v_com := 'CREATE TABLE t_ordem_cadastro as'|| > 'SELECT rownum linha, product_id, nome '|| > 'FROM products'; > > EXECUTE IMMEDIATE v_com; > > -- aqui fica o esquema do cursor implicito > -- como o cursor não precisa ser declarado recebe esse nome implicito > For verifica_ordem in (SELECT linha FROM t_ordem_cadastro FOR UPDATE) loop > Begin > UPDATE products SET product_id = v_linha > WHERE CURRENT OF verifica_ordem; > exception when orhers then > dbms_output.put_line(sqlcode || '-' || sqlerrm ) > end; > EXIT WHEN verifica_ordem%NOTFOUND; > END LOOP; > > COMMIT; > > END; > > end prc_updt_ordem_cadastro_prod > / > > 2009/11/9 Matheus Malta <maltamath...@gmail.com <maltamatheus%40gmail.com> > <mailto:maltamatheus%40gmail.com <maltamatheus%2540gmail.com>> > > > > > > > > > Olá Roberto, obrigado por sua ajuda... > > > > Digitando o comando SHOW ERROR, corrigi alguns erros e a proc foi > alterada, > > porém, tah acusando ainda erro na linha de declaração do cursor: > > > > CURSOR verifica_ordem IS > > > > o erro acusado é: > > > > PLS-00103: Encontrado o símbolo "VERIFICA_ORDEM" quando um dos > > seguintes símbolos era esperado: > > := . ( @ % ; > > > > A proc foi refeita e ficou da seguinte forma: > > > > > > CREATE OR REPLACE PROCEDURE prc_updt_ordem_cadastro_prod > > IS > > v_linha number; > > v_com varchar2(1000); > > > > BEGIN > > > > v_com := 'CREATE TABLE t_ordem_cadastro as'|| > > 'SELECT rownum linha, product_id, nome '|| > > 'FROM products'; > > > > EXECUTE IMMEDIATE v_com; > > > > CURSOR verifica_ordem IS > > > > SELECT linha > > FROM t_ordem_cadastro FOR UPDATE; > > > > BEGIN > > > > OPEN verifica_ordem; > > > > LOOP > > > > FETCH verifica_ordem into v_linha; > > > > EXIT WHEN verifica_ordem%NOTFOUND; > > > > > > UPDATE products SET product_id = v_linha > > WHERE CURRENT OF verifica_ordem; > > > > END LOOP; > > > > COMMIT; > > > > CLOSE verifica_ordem; > > > > END; > > > > END; > > / > > > > O que poderá ser agora? > > > > Grato! > > > > Matheus Malta > > > > ----- Original Message ----- > > From: "Roberto Oshikawa" <rcoshik...@gmail.com <rcoshikava%40gmail.com> > <mailto:rcoshikava%40gmail.com <rcoshikava%2540gmail.com>> <rcoshikava% > 40gmail.com>> > > To: <oracle_br@yahoogrupos.com.br <oracle_br%40yahoogrupos.com.br><mailto: > oracle_br%40yahoogrupos.com.br <oracle_br%2540yahoogrupos.com.br>> > <oracle_br%40yahoogrupos.com.br>> > > Sent: Monday, November 09, 2009 4:14 PM > > Subject: Re: [oracle_br] Dúvida - Procedure > > > > O oracle nao te mostra nenhuma mensagem de erro ? ou código do erro ? > > > > depois que vc compilar a proc digite > > > > show error > > > > 2009/11/9 Matheus Malta <maltamath...@gmail.com<maltamatheus%40gmail.com> > <mailto:maltamatheus%40gmail.com <maltamatheus%2540gmail.com>> > <maltamatheus%40gmail.com> > > > > > > > > > > > > > > > Galera... Seguinte... > > > > > > Tô tentando desenvolver uma procedure no ambiente do SQLPlus... Mas o > > > problema é que, ao compilar, ela tah acusando erro de compilação... E > não > > > mostra o erro que está ocorrendo, apenas aponta a linha onde o erro > está > > > ocorrendo... > > > > > > Fiz alguns testes removendo a linha ou substituindo o comando, mesmo > > assim, > > > ainda não consegui proceder com a compilação... > > > > > > Alguém poderia me ajudar nesse aspecto? > > > > > > Segue abaixo a procedure: > > > > > > CREATE OR REPLACE PROCEDURE prc_updt_ordem_cadastro_prod > > > IS > > > v_linha number; > > > v_com varchar2(1000); > > > > > > BEGIN > > > > > > v_com := 'CREATE TABLE t_ordem_cadastro as '|| > > > 'SELECT rownum linha, product_id, nome '|| > > > 'FROM products'; > > > > > > EXECUTE IMMEDIATTE v_com; > > > > > > CURSOR check_ordem IS > > > SELECT linha > > > FROM t_ordem_cadastro FOR UPDATE; > > > > > > BEGIN > > > > > > OPEN check_ordem; > > > > > > LOOP > > > > > > FETCH check_ordem into v_linha; > > > > > > EXIT WHEN check_ordem%NOTFOUND; > > > > > > UPDATE products SET product_id = v_linha > > > WHERE CURRENT OF check_ordem; > > > > > > END LOOP; > > > > > > COMMIT; > > > > > > CLOSE check_ordem; > > > > > > END; > > > > > > END prc_updt_ordem_cadastro_prod; > > > / > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > ------------------------------------ > > > > > > ---------------------------------------------------------- > > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de > > inteira responsabilidade de seus remetentes. > > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ > > ---------------------------------------------------------- > > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » > Procedure > > » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: > > http://www.oraclebr.com.br/ > > ---------------------------------------------------------- Links do > Yahoo! > > Grupos > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > ------------------------------------ > > ---------------------------------------------------------- > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de > inteira > responsabilidade de seus remetentes. > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ > ---------------------------------------------------------- > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure > » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: > http://www.oraclebr.com.br/ > ---------------------------------------------------------- Links do Yahoo! > Grupos > > [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] ------------------------------------ -------------------------------------------------------------------------------------------------------------------------- >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira >responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -------------------------------------------------------------------------------------------------------------------------- >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » >Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: >http://www.oraclebr.com.br/ ------------------------------------------------------------------------------------------------------------------------ Links do Yahoo! Grupos [As partes desta mensagem que não continham texto foram removidas]