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


Responder a