Dificuldade ao criar primeira procedure no oracle

Oracle

22/05/2011

Colegas,
tentei criar minha primeira procedure no oracle, mas retornou erro.
Meu objetivo era personalizar minha própria exception, dando a minha própria mensagem, mas pesquisei e não consegui.

Outra coisa foi que a mesma compilou com erro. Os erros são:

Error(3,25): PLS-00103: Encountered the symbol ";" when expecting one of the following: := . ) , @ % default character
Error(6,3): PLS-00103: Encountered the symbol ")" when expecting one of the following: := . ( @ % ; not null range default character

Podem me dar uma ajuda por favor?


CREATE OR REPLACE PROCEDURE SP_RESTRICOES(    pTABELA         INTEGER;    pOPR            VARCHAR2;    pUSUARIO        VARCHAR2    )  AS  declare   vEXCEPTION_COUNT EXCEPTION;      PRAGMA_EXCEPTION_INIT(vEXCEPTION_COUNT, -1031);      vCOUNT NUMBER;           BEGIN             SELECT COUNT(IDUSUARIO) FROM USUARIO      WHERE IDUSUARIO = pUSUARIO INTO :vCOUNT;          IF (vCOUNT = 0) THEN            RAISE vEXCEPTION_COUNT;          END IF;                         EXCEPTION       WHEN vEXCEPTION_COUNT THEN                     raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);                WHEN OTHERS THEN       raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);            END SP_RESTRICOES; 
Nilo Souza

Nilo Souza

Curtidas 0

Respostas

Anthony Accioly

Anthony Accioly

22/05/2011

Tem uns errinhos de sintaxe, o primeiro que consegui detectar foi a troca de vírgulas por ponto e vírgulas.
CREATE OR REPLACE PROCEDURE SP_RESTRICOES(    pTABELA         INTEGER,    pOPR            VARCHAR2,    pUSUARIO        VARCHAR2  ) IS


De uma olhada nos exemplos de procedures em http://psoug.org/reference/procedures.html. Se esbarrar em mais alguma coisa que não consiga resolver com os exemplos, é só postar suas dúvidas aqui de novo.
Abraços,
 
GOSTEI 0
Nilo Souza

Nilo Souza

22/05/2011

Colegas a primeira procedure eu consegui, mas a segunda esta dando um erro que pesquisei e não consegui resolver.

Esta esta dando certo

create or replace
PROCEDURE ATUALIZARUSUARIO(pusuario in number,pnome in varchar2,pgrupo in number)
is

begin

    update nsouza.usuario set nome=pnome,ID_GRUPO=pgrupo where IDUSUARIO=pusuario;
     DBMS_OUTPUT.PUT_LINE('DADOS ATUALIZADOS');
    commit;
    
    
    exception 
    
    when others then
    DBMS_OUTPUT.PUT_LINE('DADOS NÃO ATUALIZADOS');
    ROLLBACK;
    
end ATUALIZARUSUARIO;



Esta esta dando o seguinte erro:
Error(7,4): PLS-00428: an INTO clause is expected in this SELECT statement
Quebrei a cabeça e não consegui resolver!!!
create or replace PROCEDURE SP_RESTRICOES (pUsuario in number)IS  
   
BEGIN   

   select * from usuario where IDUSUARIO=pusuario;
   
  DBMS_OUTPUT.PUT_LINE('DADOS ATUALIZADOS');
           
commit;    
    
    exception 
    
    when others then
    DBMS_OUTPUT.PUT_LINE('DADOS NÃO ATUALIZADOS');
    ROLLBACK;

END SP_RESTRICOES;
/


GOSTEI 0
Deivison Melo

Deivison Melo

22/05/2011

Fiz algumas correções nessa procedure!!   Veja se essa vai dar certo:   create or replace procedure sp_restricoes( 
                                          ptabela         NUMBER, 
                                          popr            VARCHAR2, 
                                          pusuario        varchar2 
                                          ) 
is     vexception_count exception; 
    pragma exception_init(vexception_count, -1031); 
    vcount number; 
begin    
    
   select count(idusuario)
     into vcount 
     from usuario  
    where upper(idusuario) = upper(pusuario);    if (vcount = 0) then 
     raise vexception_count; 
   end if;  exception 
   when vexception_count then 
     /*o sqlerrm já mostra o código e descrição do erro*/ 
     raise_application_error(-20001,'Erro 01 - '||'erro: '||sqlerrm);
   when others then 
     raise_application_error(-20002,'Erro 02 - '||'erro: '||sqlerrm);
end;  
GOSTEI 0
Nilo Souza

Nilo Souza

22/05/2011

Uma duvida, pq vc teve que usar Into e declarar uma varialvel VCount
GOSTEI 0
Rafael Mattos

Rafael Mattos

22/05/2011

Uma duvida, pq vc teve que usar Into e declarar uma varialvel VCount



vCount: ele criou para receber qtde de usuarios
Into: Serve para jogar o valor dentro da variavel
GOSTEI 0
Nilo Souza

Nilo Souza

22/05/2011

Então se eu quisese usar Select * from usuario eu teria que declarar 1 variavel do tipo varchar2 ou teria que declarar uma variavel para cada campo da tabela? Não entendi bem essa parte na apostila que li. Se não for pedir muito poderia me dar um exemplo simples? Obrigado desde já pela ajuda!
GOSTEI 0
Rafael Mattos

Rafael Mattos

22/05/2011

Então se eu quisese usar Select * from usuario eu teria que declarar 1 variavel do tipo varchar2 ou teria que declarar uma variavel para cada campo da tabela? Não entendi bem essa parte na apostila que li. Se não for pedir muito poderia me dar um exemplo simples? Obrigado desde já pela ajuda!



* from não o correto seria vc fazer assim



----------------------

    vcampo1 varchar(10);
    vcampo2 varchar(10);
begin    
    select campo1, campo2 from usuario
     into :vcampo1, vcampo2;
end



----------------------


qualquer banco q vc trabalhe vai ser parecida a regra o que muda vai ser a forma de declarar a variavel
GOSTEI 0
Nilo Souza

Nilo Souza

22/05/2011

Entendi, mas seu eu quiser usar o where ficaria como?     vcampo1 varchar(10);
    vcampo2 varchar(10);
begin      
    select nome, login from usuario
     into :vcampo1, vcampo2 where idUsuario = psusuario (nota: pusuario é o paremetro da procedure)
end
GOSTEI 0
Rafael Mattos

Rafael Mattos

22/05/2011

ficaria antes




begin      
    select nome, login from usuario
        where idUsuario = psusuario (nota: pusuario é o paremetro da procedure)
             and  campo = :outrofiltro
     into :vcampo1, vcampo2 where 
end
GOSTEI 0
Nilo Souza

Nilo Souza

22/05/2011

    
ficou meio confuso. Pq 2 where, poderia fazer mais simples?

select nome, login from usuario
        where idUsuario = psusuario (nota: pusuario é o paremetro da procedure)
             and  campo = :outrofiltro
     into :vcampo1, vcampo2 where 
GOSTEI 0
Nilo Souza

Nilo Souza

22/05/2011

Consegui muito obrigado!
GOSTEI 0
Anthony Accioly

Anthony Accioly

22/05/2011

Resolvido?

Se sim, por favor feche o chamado.
GOSTEI 0
POSTAR