- Este tópico contém 8 respostas, 3 vozes e foi atualizado pela última vez 9 anos, 11 meses atrás por Marcelo Silva.
-
AutorPosts
-
17 de novembro de 2014 às 11:00 pm #107130Marcelo SilvaParticipante
Olá,
estou com problema para conseguir executar um comando qualquer após o ‘end’ que fecha o declare.
Qualquer comando (select, create table, etc) que eu coloco após esse ‘end’ dá erro e não executa.O erro é o seguinte:
Relatório de erro:
ORA-06550: linha 405, coluna 1:
PLS-00103: Encontrado o símbolo “SELECT”
06550. 00000 – “line %s, column %s:n%s”
*Cause: Usually a PL/SQL compilation error.
*Action:O script é (simplificando) esse aqui:
declare
cursor c1 is
select … ;begin
for item in c1 loop …
end loop;insert into … ;
commit;
end;
SELECT * FROM T_TEMP; — O erro é que ele não consegue executar esse comando aqui. Na verdade dá erro em qualquer comando quando colocado após esse último ‘end’ (acima).
Porém, se eu só executar do comando ‘declare’ até o último ‘end’ (ou seja, sem tentar executar o ‘select * from t_temp’), ele não dá erro nenhum. Executa normalmente.
Se alguém puder me ajudar eu ficaria muito agradecido.
18 de novembro de 2014 às 6:10 am #107131caadecarvalhoParticipanteOlá, Marcelo.
Não entendi bem quando você menciona sobre o END após o DECLARE. Você poderia disponibilizar o código PL/SQL completo? Pois pelo teste que efetuei, o erro não foi apresentado. Abaixo segue evidência.
SQL> declare
2 cursor c1 is select count(*) from dba_tables;
3 begin
4 for item in c1 loop
5 null;
6 end loop;
7 end;
8 /PL/SQL procedure successfully completed.
Abraços.
Carlos
21 de novembro de 2014 às 10:05 pm #107140Marcelo SilvaParticipantePrezado Carlos Anibal,
desculpe pela demora em responder.
Eu anexei o script aqui.
Não me expressei bem. O erro acontece em qualquer comando que eu coloque após o último ‘end;’ do script aqui anexado.
Obs: O script pode ser grandinho, mas não é complicado. Na verdade os comandos se repetem algumas vezes.
Desde já agradeço a sua atenção.
Marcelo
Attachments:24 de novembro de 2014 às 6:23 pm #107141rmanParticipante@Marcelo Silva
Funciona da seguinte maneira. Todo comando deve ser terminado pelo caracter “;” e todo bloco PL/SQL deve ser terminado pelo caracter “/”.
Em relação ao SELECT. Todo SELECT dentro de um bloco PL/SQL deve ser atribuído a uma variável caso o resultado seja um registro apenas. Se for vários registro é necessário declarar um CURSOR.
DECLARE
VNOME VARCHAR2(64);
BEGIN
SELECT NOME INTO VNOME FROM CLIENTES WHERE CLIENTE_ID = 1;
END;
/
26 de novembro de 2014 às 11:16 pm #107153Marcelo SilvaParticipanteRman,
entendi sua explicação. Porém o problema não é bem esse.
O problema é que depois do cursor que eu coloquei no script (que está em anexo na minha mensagem anterior), todo comando que eu coloco dá erro.
O que parece é que não terminei o cursor corretamente ou então que não destruí alguma variável ou falta algum ‘end’.
Não sei o que acontece.
27 de novembro de 2014 às 2:21 pm #107154rmanParticipante@Marcelo Silva
O bloco PL/SQL deve ser terminado com “/” e depois vem um comando SQL terminado com “;”. Veja que vai funcionar desta forma. No seu caso você não terminou o bloco PL/SQL.
DECLARE
VNOME VARCHAR2(64);
BEGIN
SELECT NOME INTO VNOME FROM CLIENTES WHERE CLIENTE_ID = 1;
END;
/
SELECT * FROM CLIENTES;
27 de novembro de 2014 às 7:31 pm #107160Marcelo SilvaParticipantePrezado Rman,
eu nunca tinha participado de nenhum fórum de sql.
Vou te confessar que quando coloquei a minha pergunta aqui eu não acreditei que alguém fosse resolver.
Fosse por desconhecimento de sql e PL/SQL ou simplesmente por falta de vontade de tentar resolver.
Mas, felizmente eu estava enganado.
Você me deu uma resposta rápida, clara e objetiva.
Muito obrigado mesmo. Fiquei com uma ótima impressão dessa lista.Gostaria de agradecer a pró-atividade do Carlos Anibal em me ajudar.
Carlos Anibal, obrigado também.Att,
Marcelo Silva
27 de novembro de 2014 às 7:46 pm #107161rmanParticipante@Marcelo Silva
Quando eu me cadastrei no GPO a 3 anos e meio atrás também cheguei a pensar que ninguém ia responder minhas dúvidas. 🙂 E tive a mesma surpresa que você.
Hoje costumo responder os tópicos sempre que posso. Aprendi muito coisa por meio deste fórum.
2 de dezembro de 2014 às 5:30 pm #107165Marcelo SilvaParticipanteÉ verdade, já vi que dá para aprender bastante coisa por aqui.
Agora eu também, sempre que puder vou responder aos tópicos e dar minha contribuição.
Att,
Marcelo Silva
-
AutorPosts
- Você deve fazer login para responder a este tópico.