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 <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ <*> Para sair deste grupo, envie um e-mail para: oracle_br-unsubscr...@yahoogrupos.com.br <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html