- Este tópico contém 19 respostas, 6 vozes e foi atualizado pela última vez 16 anos, 10 meses atrás por
David Siqueira.
-
AutorPosts
-
24 de abril de 2009 às 8:00 pm #86417
mpvargas
ParticipanteCaros 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;
24 de abril de 2009 às 8:39 pm #86425Manoel872
ParticipanteMpVargas,
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
24 de abril de 2009 às 8:40 pm #86426Rodrigo Mesquita
ParticipanteVargas
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;24 de abril de 2009 às 9:52 pm #86430mpvargas
ParticipanteValeu 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?
Obrigado24 de abril de 2009 às 10:07 pm #86433Ishii
ParticipanteOlá,
Precisa declarar as variáveis de saída tb e passar como parâmetro na Procedure…
[]s Ishii
24 de abril de 2009 às 10:13 pm #86434mpvargas
ParticipanteIshii,
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?
24 de abril de 2009 às 10:26 pm #86435Rodrigo Mesquita
Participantedeclara 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);
24 de abril de 2009 às 10:40 pm #86436mpvargas
ParticipanteRodrigo,
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:24 de abril de 2009 às 11:09 pm #86438Rodrigo Mesquita
ParticipanteCara foi mal faltou o :
var pNome varchar2;
var pCampus varchar2;
var pCodCurso varchar2;
var pNomeCurso varchar2;EXECUTE PROC_MAT(1000,:pNome,:pCampus,:pCodCurso,:pNomeCurso);
24 de abril de 2009 às 11:25 pm #86439Regis Araujo
ParticipanteVargas, 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…
24 de abril de 2009 às 11:27 pm #86442mpvargas
ParticipanteValeu galera, obrigado pela ajuda de todos.
Executei pelo SQL Developer
Resultado = anonymous block completedExecutei 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.
24 de abril de 2009 às 11:31 pm #86443mpvargas
ParticipanteDesculpe,
no Oracle as procedures podem retornar valor.24 de abril de 2009 às 11:32 pm #86444Rodrigo Mesquita
Participanteno sqlplus antes de executar a procedure executa antes
set serveroutput on;
24 de abril de 2009 às 11:44 pm #86445mpvargas
ParticipanteFiz 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.
24 de abril de 2009 às 11:52 pm #86448David Siqueira
ParticipanteDesculpa 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
-
AutorPosts
- Você deve fazer login para responder a este tópico.