Pular para o conteúdo
  • Este tópico contém 2 respostas, 2 vozes e foi atualizado pela última vez 16 anos, 8 meses atrás por thianolima.
Visualizando 3 posts - 1 até 3 (de 3 do total)
  • Autor
    Posts
  • #87877
    thianolima
    Participante

      Ola 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]

      #87879
      Avatar photoLeonardo Litz
      Participante

        Olá 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_RECNO

        Não teria como vc pegar estas informações da tabela MENU, apartir da trigger?

        Vlw Leonardo Litz[/code]

        #87880
        thianolima
        Participante

          Entao 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

        Visualizando 3 posts - 1 até 3 (de 3 do total)
        • Você deve fazer login para responder a este tópico.