Fórum Trigger para chamar uma procedure. #401910
28/05/2011
0
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
Curtir tópico
+ 0Posts
28/05/2011
Anthony Accioly
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,
Gostei + 0
28/05/2011
Nilo Souza
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;
Gostei + 0
28/05/2011
Anthony Accioly
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,
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!
Gostei + 0
29/05/2011
Deivison Melo
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;
/
Gostei + 0
29/05/2011
Anthony Accioly
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?
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)