Pular para o conteúdo
  • Este tópico contém 19 respostas, 6 vozes e foi atualizado pela última vez 16 anos, 10 meses atrás por David Siqueira.
Visualizando 15 posts - 1 até 15 (de 20 do total)
  • Autor
    Posts
  • #86417
    mpvargas
    Participante

      Caros Amigos,
      Estou “engatinhando” na construção de procedures, e estou precisando de uma ajuda.
      Preciso criar uma procedure que leia uma Matricula e retorne alguns valores.
      Estou recebendo erros na compilação, mas não consigo resolver.
      Error(1): PL/SQL: Compilation unit analysis terminated
      Error(3,38): PLS-00208: identifier ‘VARCHAR’ is not a legal cursor attribute
      Obrigado pela ajuda.

      create or replace PROCEDURE PROC_MAT
      ( pNome IN PROC1.NOME%VARCHAR2
      , pCampus IN PROC1.CAMPUS%VARCHAR2
      , pCodCurso IN PROC1.CODCURSO%NUMBER
      , pNomeCurso IN PROC1.NOMECURSO%VARCHAR2
      , pMatricula OUT PROC1.MATRICULA%NUMBER
      , pErro OUT VARCHAR2
      )
      IS
      vErro VARCHAR2(400);
      BEGIN
      SELECT NOME,CAMPUS,CODCURSO,NOMECURSO
      INTO pNOME,pCAMPUS,pCODCURSO,pNOMECURSO
      FROM PROC1
      WHERE MATRICULA=pMATRICULA;

      IF MATRICULA <> pMATRICULA THEN
      vErro := ‘Matrícula inválida.’;
      END IF;

      pErro := vErro;

      END;

      #86425
      Manoel872
      Participante

        MpVargas,

        Veja bem acredito que o erro esteja que você declara as variaveis da procedure do tipo in e tenta passar valores para ela, tenta colocar do tipo IN OUT.

        Att,

        Manoel

        #86426
        Rodrigo Mesquita
        Participante

          Vargas

          Voce não pode dar um select into em uma variável IN.

          Se vc quiser consultar esses dados consultando pelo numero da matricula faça assim.

          create or replace PROCEDURE PROC_MAT
          (pMatricula in PROC1.MATRICULA%type,
          pNome OUT PROC1.NOME%type,
          pCampus OUT PROC1.CAMPUS%type,
          pCodCurso OUT PROC1.CODCURSO%type,
          pNomeCurso OUT PROC1.NOMECURSO%type ,
          pErro OUT VARCHAR2
          )
          IS
          BEGIN
          SELECT NOME,CAMPUS,CODCURSO,NOMECURSO
          INTO pNOME,pCAMPUS,pCODCURSO,pNOMECURSO
          FROM PROC1
          WHERE MATRICULA=pMATRICULA;

          Exception
          When no_data_found Then
          vErro := ‘Matrícula inválida.’;
          END;

          #86430
          mpvargas
          Participante

            Valeu pela ajuda companheiros.
            Realmente acho que fiz uma grande confusão.
            Obrigado.

            Rodrigo,
            Fiz a compilação e funcionou blz.
            Quando fui executar deu o seguinte erro:

            Error starting at line 1 in command:
            EXECUTE PROC_MAT(1000);
            Error report:
            ORA-06550: line 1, column 7:
            PLS-00306: wrong number or types of arguments in call to ‘PROC_MAT’
            ORA-06550: line 1, column 7:
            PL/SQL: Statement ignored
            06550. 00000 – “line %s, column %s:n%s”
            *Cause: Usually a PL/SQL compilation error.
            *Action:

            Será que falta passar o valor de alguma variável?
            Estou usando o SQL Developer. Como faço para compilar no SQL Plus?
            Obrigado

            #86433
            Ishii
            Participante

              Olá,

              Precisa declarar as variáveis de saída tb e passar como parâmetro na Procedure…

              []s Ishii

              #86434
              mpvargas
              Participante

                Ishii,

                Eu executei dessa forma

                EXECUTE PROC_MAT(1000);

                Passei o valor da Matrícula.
                Isso vai funcionar no site… no caso o Aluno digita a Matrícula e recebe informações como curso, nome do curso, etc.

                Onde devo declarar as variáveis?

                #86435
                Rodrigo Mesquita
                Participante

                  declara elas depois coloca na procedure para receber o valor

                  var pNome varchar2;
                  var pCampus varchar2;
                  var pCodCurso varchar2;
                  var pNomeCurso varchar2;

                  EXECUTE PROC_MAT(1000,pNome,pCampus,pCodCurso,pNomeCurso);

                  #86436
                  mpvargas
                  Participante

                    Rodrigo,

                    Não entendi o que aconteceu.
                    Fiz conforme você falou, mas deu erro dizendo que a variável precisa ser declarada.

                    Error starting at line 9 in command:
                    EXECUTE PROC_MAT(1000,pNOME,pCAMPUS,pCODCURSO,pNOMECURSO,pCPF,pEMAIL,pNASCIMENTO);
                    Error report:
                    ORA-06550: line 1, column 21:
                    PLS-00201: identifier ‘PNOME’ must be declared
                    ORA-06550: line 1, column 7:
                    PL/SQL: Statement ignored
                    06550. 00000 – “line %s, column %s:n%s”
                    *Cause: Usually a PL/SQL compilation error.
                    *Action:

                    #86438
                    Rodrigo Mesquita
                    Participante

                      Cara foi mal faltou o :

                      var pNome varchar2;
                      var pCampus varchar2;
                      var pCodCurso varchar2;
                      var pNomeCurso varchar2;

                      EXECUTE PROC_MAT(1000,:pNome,:pCampus,:pCodCurso,:pNomeCurso);

                      #86439
                      Avatar photoRegis Araujo
                      Participante

                        Vargas, boa tarde!

                        Desculpa a intromissão.. mas só uma dúvida.. vc precisa desta procedure para retornar valores dentro de um site web??

                        Se sim, será que não é mais fácil você fazer um select simples dentro do proprio código para verificar se a matricula existe retornando 0 ou 1..
                        E para retornar as informaçoes do aluno realizar outro select caso o retorno do select anterior for 1…

                        Bom.. eu acho bem mais simples…. pois em algumas linguagens web é bem dificul executar uma procedure…

                        Qual a linguagem web que você está utilizando??

                        Abraços…

                        #86442
                        mpvargas
                        Participante

                          Valeu galera, obrigado pela ajuda de todos.

                          Executei pelo SQL Developer
                          Resultado = anonymous block completed

                          Executei pelo SQL Plus
                          Resultado = PL/SQL procedure successfully completed.

                          Eu sei que as procedures não retornam valor, mas como faço para ver o resultado, digo, exibir na tela o resultado. Coloquei uma matrícula existente e uma inexistente.
                          Gostaria de ver os valores e no caso da matrícula inexistente ver a msg matrícula inválida.

                          Obrigado.

                          #86443
                          mpvargas
                          Participante

                            Desculpe,
                            no Oracle as procedures podem retornar valor.

                            #86444
                            Rodrigo Mesquita
                            Participante

                              no sqlplus antes de executar a procedure executa antes

                              set serveroutput on;

                              #86445
                              mpvargas
                              Participante

                                Fiz dessa forma e deu o seguinte resultado:

                                SQL> set serveroutput on;
                                SQL> VAR pNOME VARCHAR2;
                                SQL> VAR pCAMPUS VARCHAR2;
                                SQL> VAR pCODCURSO NUMBER;
                                SQL> VAR pNOMECURSO VARCHAR2;
                                SQL> VAR pCPF VARCHAR2;
                                SQL> VAR pEMAIL VARCHAR2;
                                SQL> VAR pNASCIMENTO VARCHAR2;
                                SQL> VAR pERRO VARCHAR2;
                                SQL> EXECUTE MSIGA.PROC_MAT(1000, :pNOME,:pCAMPUS,:pCODCURSO,:pNOMECURSO,
                                :pCPF,:pEMAIL,:pNASCIMENTO,:pERRO);

                                PL/SQL procedure successfully completed.

                                #86448
                                David Siqueira
                                Participante

                                  Desculpa a intromissão, mais no sqlplus alem do set serveroutputo on , você vai precisar usar a DBMS_OUTPUT.PUT_LINE no corpo da sua procure, para que ela retorne os valores recebidos pela sua instrução no corpo da procedure.

                                  Um exemplo bem simples de utilização de Output :

                                  SET VERIFY OFF;
                                  SET SERVEROUTPUT ON;

                                  DECLARE
                                  CURSOR DBA_CUR IS
                                  SELECT USERNAME FROM DBA_USERS;
                                  V_DBA varchar2(50);
                                  BEGIN
                                  OPEN DBA_CUR;
                                  FETCH DBA_CUR INTO V_DBA;
                                  CLOSE DBA_CUR;
                                  DBMS_OUTPUT.PUT_LINE('Ususario:'||V_DBA);
                                  END;
                                  /

                                  Abraço.
                                  Espero que ajude.

                                  David

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