Pular para o conteúdo
  • Este tópico contém 8 respostas, 3 vozes e foi atualizado pela última vez 9 anos, 11 meses atrás por Avatar de Marcelo SilvaMarcelo Silva.
Visualizando 9 posts - 1 até 9 (de 9 do total)
  • Autor
    Posts
  • #107130
    Avatar de Marcelo SilvaMarcelo Silva
    Participante

      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.

      #107131
      Avatar de caadecarvalhocaadecarvalho
      Participante

        Olá, 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

        #107140
        Avatar de Marcelo SilvaMarcelo Silva
        Participante

          Prezado 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:
          #107141
          Avatar de rmanrman
          Participante

            @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;
            /

            #107153
            Avatar de Marcelo SilvaMarcelo Silva
            Participante

              Rman,

              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.

              #107154
              Avatar de rmanrman
              Participante

                @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;

                #107160
                Avatar de Marcelo SilvaMarcelo Silva
                Participante

                  Prezado 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

                  #107161
                  Avatar de rmanrman
                  Participante

                    @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.

                    #107165
                    Avatar de Marcelo SilvaMarcelo Silva
                    Participante

                      É 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

                    Visualizando 9 posts - 1 até 9 (de 9 do total)
                    • Você deve fazer login para responder a este tópico.
                    plugins premium WordPress