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 [mailto:oracle...@yahoogrupos.com.br] Em
nome de Matheus Malta
Enviada em: segunda-feira, 9 de novembro de 2009 17:32
Para: oracle_br@yahoogrupos.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
<mailto:rcoshikava%40gmail.com> >
To: <oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.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
<mailto:maltamatheus%40gmail.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
<mailto:rcoshikava%40gmail.com>  <rcoshikava%40gmail.com>>
> To: <oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.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
<mailto:maltamatheus%40gmail.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]

Responder a