Fórum Trigger para chamar uma procedure. #401910

28/05/2011

0

Colegas, após ter uma excelente ajuda para criar uma procedure eu consegui finalmente. Mas agora tentei criar uma trigger para chamar essa procedure e tive o erro.
   
  Error(5,12): PLS-00103: Encountered the symbol "SP_RESTRICOES" when expecting one of the following:    := . ( @ % ; The symbol ":=" was substituted for "SP_RESTRICOES" to continue.
  Error(9,10): PLS-00103: Encountered the symbol "SP_RESTRICOES" when expecting one of the following:    := . ( @ % ; The symbol ":=" was substituted for "SP_RESTRICOES" to continue.
  Error(13,10): PLS-00103: Encountered the symbol "SP_RESTRICOES" when expecting one of the following:    := . ( @ % ; The symbol ":=" was substituted for "SP_RESTRICOES" to continue.  
Abaixo a procedure:
[CODE]
create or replaceTRIGGER verificaRestricaoBEFORE INSERT OR UPDATE OR  DELETE ON FORNECEDOR FOR EACH ROWBEGIN
  IF INSERTING THEN        call sp_restricoes(6,'I',:new.idusuario);        elsif updating then      call sp_restricoes(6,'U',:new.idusuario);    elsif deleting then        call sp_restricoes(6,'D',:old.idusuario);    END IF;
END;
[/CODE/
Nilo Souza

Nilo Souza

Responder

Posts

28/05/2011

Anthony Accioly

Opa,

Esse exemplo demonstra a sintaxe para chamar procedures dentro de um Trigger: http://download.oracle.com/docs/cd/E12151_01/doc.150/e12154/samples_access.htm O que eu consigo ver de diferente é que ele está especificando o nome do pacote do Trigger e não está usando CALL.
Fora isso, parece tudo razoavelmente certo (não estou com Oracle instalado em casa para testar, e nem tenho seu procedure aqui). O procedure foi criado com esses parâmetros e está no pacote padrão? Você vê ele no SQL Developer ou na sua ferramenta de desenvolvimento? Consegue chamá-lo?).
Uma dica do ponto de vista de organização. Matenha uma padrão de código definindo se vai usar letras maiúsculas ou minúsculas e também sua política de espaçamento. Misturar comandos maiúsculos com minúsculos e quebras de linha fora de padrão confundem quem está lendo.

Abraços,
Responder

Gostei + 0

28/05/2011

Nilo Souza

Estou aprendendo oracle. Decidi usar pq ele é multiplataforma e no linux tem uma ferramenta sql developer muito boa, contrario ao do Firebird. Por isso tem aluguns detalhes que não sei. O procedure foi criado com esses parâmetros e está no pacote padrão?Sim. Sobre o pacote tenho que aprender sobre esse assunto.
 Você vê ele no SQL Developer ou na sua ferramenta de desenvolvimento? sql developer.
Consegue chamá-lo?). Sim. Normal.

Abaixo o procedure que perguntou.
create or replaceprocedure sp_restricoes( ptabela         NUMBER, popr            VARCHAR2, pusuario        varchar2) AS
    vexception_count exception;     pragma exception_init(vexception_count, -1031);     vcount number;         /*Definir propria mensagem de erro*/    e_user_not_found exception;    e_user_not_allow exception;      vInlcluir   GRUPO_ACESSO_SUB.INCLUIR%type;  vAlterar    GRUPO_ACESSO_SUB.ALTERAR%type;  vExcluir    GRUPO_ACESSO_SUB.EXCLUIR%type;  vVisualizar GRUPO_ACESSO_SUB.VISUALIZAR%type;  vImprimir   GRUPO_ACESSO_SUB.IMPRIMIR%type;  vUsuario    USUARIO.IDUSUARIO%TYPE;  vTabela number;  vTipoCadatro varchar(10);  begin 

  if (popr = 'I') then      vtipocadatro := 'Incluir';      elsif (popr = 'U') then      vtipocadatro := 'Alterar';    elsif (popr = 'D') then      vtipocadatro := 'Excluir';       elsif (popr = 'W') then      vtipocadatro := 'Visualizar';      elsif (popr = 'P') then      vtipocadatro := 'Imprimir';     end if;
       select count(idusuario)     into vcount      from usuario      where upper(idusuario) = upper(pusuario);
   if (vcount = 0) then      raise e_user_not_found;    end if; 
  SELECT G.ID_TABELA,U.IDUSUARIO,G.INCLUIR,G.ALTERAR,G.EXCLUIR,G.VISUALIZAR,G.IMPRIMIR    INTO vTabela,vUsuario,vInlcluir,vAlterar,vExcluir,vVisualizar,vImprimir    FROM USUARIO U     INNER JOIN GRUPO_ACESSO_SUB G ON G.ID_GRUPO = U.ID_GRUPO    WHERE UPPER(U.IDUSUARIO) = upper(pusuario) and  upper(G.ID_TABELA) = upper(PTABELA);      -- Não permitir a inclusão        if (vInlcluir = 'N') and (popr = 'I') then         raise e_user_not_allow;      end if;         if (vAlterar = 'N') and (popr = 'U') then         raise e_user_not_allow;      end if;            if (vExcluir = 'N') and (popr = 'D') then         raise e_user_not_allow;      end if;             if (vVisualizar = 'N') and (popr = 'W') then         raise e_user_not_allow;      end if;    if (vImprimir = 'N') and (popr = 'P') then         raise e_user_not_allow;      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 e_user_not_found then       raise_application_error(-20005,'Usuario não cadastrado - '||'erro: '||sqlcode ||' erro sql: '||sqlerrm);    when e_user_not_allow then      raise_application_error(-20006,'Usuario não altorizado a ' || vtipocadatro || ' - '||'erro: '||sqlcode ||' erro sql: '||sqlerrm);        when others then      raise_application_error(-20002,'Erro 02 - '||'erro: '||sqlerrm);end; 
Responder

Gostei + 0

28/05/2011

Anthony Accioly

Beleza,

Segunda vou ter acesso ao Oracle e faço um teste (se você ou outra pessoa não resolver o problema primeiro).
Por enquanto tenta dar uma olhada naquele link que te passei e tentar chamar o stored procedure direto na Trigger, sem usar CALL.

Abraços,
Responder

Gostei + 0

29/05/2011

Nilo Souza


  Sem o call funciona, mas vi que não ficou pratico.Vou dar este post como concluido.Por este topico, muito obrigado!
Responder

Gostei + 0

29/05/2011

Deivison Melo

Segue exemplo:   CREATE OR REPLACE TRIGGER mdsys.sdo_geom_trig_del1
INSTEAD OF DELETE ON mdsys.user_sdo_geom_metadata
REFERENCING OLD AS n
FOR EACH ROW
declare
 tname varchar2(32);
 stmt  varchar2(2048);
 vcount INTEGER;
BEGIN   /*aqui vc exexuta o que quiser*/
  EXECUTE IMMEDIATE
  'SELECT user FROM dual' into tname;
    DELETE FROM  sdo_geom_metadata_table
    WHERE SDO_OWNER = tname
      AND SDO_TABLE_NAME = upper(:n.table_name)
      AND SDO_COLUMN_NAME = upper(:n.column_name);   /*aqui vc poderia chamar a procedure*/
  sys.logon_proc wrapped; END;
/  
Responder

Gostei + 0

29/05/2011

Anthony Accioly

Nilo,

Não entendi como deixar de escrever CALL dificulta seu caso de uso.

Você entendeu que minha sugestão foi para você substituir isso:
call sp_restricoes(6,'I',:new.idusuario);

Por isso:
sp_restricoes(6,'I', :new.idusuario);


Né? Funcionou? Por que ficou complicado?
Responder

Gostei + 0

29/05/2011

Nilo Souza


  Não ficou complicado, sua sugestão ate resolveu. Me expressei mal. Eu disse que a maneira com que eu estava desenvolvendo eu não estava gostando ai mudei meus planos. Mas quando a sua ajuda foi otima, funcionou!!Muito obrigado.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar