- Este tópico contém 2 respostas, 2 vozes e foi atualizado pela última vez 16 anos, 8 meses atrás por
thianolima.
-
AutorPosts
-
14 de julho de 2009 às 11:56 pm #87877
thianolima
ParticipanteOla pessoal… tenho um trigger do tipo AFTER UPDATE que segue abaixo e a mesma chama um SPC q faz uma select na tabela da trigger… ela faz um join usando esta tabela. O problema e q se eu deixar sem o famoso comando PRAGMA AUTONOMOUS_TRANSACTION; ocorre o erro de mutanting, e se eu colocar esse comando o erro nao ocorre mas acontece um problema serio q é o seguinte. A SPC nao enxerga os dados alterados ou seja a trigger executa antes de dar commit na tabela e ela so poderia executar apos o commit.
create or replace
TRIGGER TRG_MENU_AU
AFTER UPDATE ON MENU
FOR EACH ROW
DECLARE
CURSOR VR_CURSOR(VR_MEN_RECNO VARCHAR2) IS
SELECT USU_RECNO FROM PERMISSAO
WHERE MEN_RECNO = VR_MEN_RECNO AND USU_RECNO IS NOT NULL;BEGIN
COMMIT;FOR X IN VR_CURSOR(:NEW.MEN_RECNO) LOOP
PRC_PERMISSAO_PADRAO(X.USU_RECNO);
END LOOP;
END;
Procedure q a trigger executa
create or replace PROCEDURE PRC_PERMISSAO_PADRAO(VE_USU_RECNO IN NUMBER) AS
CURSOR VR_CURSOR(VR_USU_RECNO NUMBER) IS
SELECT
P.PER_RECNO,
P.MEN_RECNO,
CASE
WHEN M.MEN_CENTRO_CUSTO = 'S' THEN 'S'
WHEN M.MEN_CLASSE_VALOR = 'S' THEN 'S'
WHEN M.MEN_ITEM_CONTABIL = 'S' THEN 'S'
ELSE 'N'
END
FROM PERMISSAO P
INNER JOIN MENU M ON M.MEN_RECNO = P.MEN_RECNO
WHERE USU_RECNO = VR_USU_RECNO;VR_PER_RECNO PERMISSAO.PER_RECNO%TYPE;
VR_MEN_RECNO PERMISSAO.MEN_RECNO%TYPE;
VR_CUSTO MENU.MEN_CENTRO_CUSTO%TYPE;
VR_CEN_RECNO CENTRO_CUSTO.CEN_RECNO%TYPE;
VR_CLA_RECNO CLASSE_VALOR.CLA_RECNO%TYPE;
VR_ITC_RECNO ITEM_CONTABIL.ITC_RECNO%TYPE;
VR_CONT NUMBER;BEGIN
OPEN VR_CURSOR(VE_USU_RECNO);LOOP
FETCH VR_CURSOR INTO VR_PER_RECNO, VR_MEN_RECNO, VR_CUSTO;EXIT WHEN VR_CURSOR%NOTFOUND;
--SE PRECISA INSERIR OS NIVEIS DE CUSTO PARA ESTA TELA
IF(VR_CUSTO = 'S')THEN
--PEGA OS NIVEIS DE CUSTO DO FUNCIONARIO
SELECT F.CEN_RECNO, F.CLA_RECNO, F.ITC_RECNO
INTO VR_CEN_RECNO, VR_CLA_RECNO, VR_ITC_RECNO
FROM USUARIO U
INNER JOIN FUNCIONARIO F ON F.FUN_RECNO = U.FUN_RECNO
WHERE U.USU_RECNO = VE_USU_RECNO;--VERIFICA SE EXISTE CENTRO DE CUSTO P/ ESSA TELA CADASTRADO
SELECT COUNT(1)
INTO VR_CONT
FROM PERMISSAO_CENTRO_CUSTO
WHERE CEN_RECNO = VR_CEN_RECNO
AND MEN_RECNO = VR_MEN_RECNO
AND USU_RECNO = VE_USU_RECNO;IF(VR_CONT <= 0)THEN INSERT INTO PERMISSAO_CENTRO_CUSTO(PCC_RECNO, CEN_RECNO, MEN_RECNO, USU_RECNO) VALUES (SEQ_PERMISSAO_CENTRO_CUSTO.NEXTVAL, VR_CEN_RECNO, VR_MEN_RECNO, VE_USU_RECNO); END IF; --VERIFICA SE EXISTE CLASSE VALOR P/ ESSA TELA CADASTRADO SELECT COUNT(1) INTO VR_CONT FROM PERMISSAO_CLASSE_VALOR WHERE CLA_RECNO = VR_CLA_RECNO AND MEN_RECNO = VR_MEN_RECNO AND USU_RECNO = VE_USU_RECNO; IF(VR_CONT <= 0)THEN INSERT INTO PERMISSAO_CLASSE_VALOR(PCV_RECNO, CLA_RECNO, MEN_RECNO, USU_RECNO) VALUES (SEQ_PERMISSAO_CLASSE_VALOR.NEXTVAL, VR_CLA_RECNO, VR_MEN_RECNO, VE_USU_RECNO); END IF; --VERIFICA SE EXISTE ITEM CONTABIL P/ ESSA TELA CADASTRADO SELECT COUNT(1) INTO VR_CONT FROM PERMISSAO_ITEM_CONTABIL WHERE ITC_RECNO = VR_ITC_RECNO AND MEN_RECNO = VR_MEN_RECNO AND USU_RECNO = VE_USU_RECNO; IF(VR_CONT <= 0)THEN INSERT INTO PERMISSAO_ITEM_CONTABIL(PIC_RECNO, ITC_RECNO, MEN_RECNO, USU_RECNO) VALUES (SEQ_PERMISSAO_ITEM_CONTABIL.NEXTVAL, VR_ITC_RECNO, VR_MEN_RECNO, VE_USU_RECNO); END IF; END IF; END LOOP; COMMIT; END PRC_PERMISSAO_PADRAO;
[/code]15 de julho de 2009 às 12:10 am #87879Leonardo Litz
ParticipanteOlá Thiago, me diz uma coisa, qual a chave primaria da tabela MENU?
Verifique se o cursor abaixo realmente precisa fazer relação com a tabela MENU:
CURSOR VR_CURSOR(VR_USU_RECNO NUMBER) IS
SELECT
P.PER_RECNO,
P.MEN_RECNO,
CASE
WHEN M.MEN_CENTRO_CUSTO = 'S' THEN 'S'
WHEN M.MEN_CLASSE_VALOR = 'S' THEN 'S'
WHEN M.MEN_ITEM_CONTABIL = 'S' THEN 'S'
ELSE 'N'
END
FROM PERMISSAO P
INNER JOIN MENU M ON M.MEN_RECNO = P.MEN_RECNO
WHERE USU_RECNO = VR_USU_RECNONão teria como vc pegar estas informações da tabela MENU, apartir da trigger?
Vlw Leonardo Litz[/code]
15 de julho de 2009 às 12:55 am #87880thianolima
ParticipanteEntao amigo… a pk chama-se men_recno….
A unica maneira q eu encontrei foi quebrar a prc em 2 partes e dai passar na parte igual das duas sempres a chave primaria.. nao era oq qria mas fazer oq…rs -
AutorPosts
- Você deve fazer login para responder a este tópico.