Pular para o conteúdo
Visualizando 15 posts - 1 até 15 (de 17 do total)
  • Autor
    Posts
  • #90114
    vieira
    Participante

      Pessoal, estou executando uma trigger mas quando faço o update aparece o seguinte erro

      ORA-06502: PL/SQL: numeric or value error: character string buffer too small

      essa eh a minha declaração das variáveis….

      CREATE OR REPLACE TRIGGER tgr_GeraCodServico
      BEFORE INSERT OR UPDATE
      ON CADMAT
      REFERENCING NEW AS novo_campo
      FOR EACH ROW
      DECLARE
      Pragma Autonomous_Transaction;
      V_COD_CADMAT CHAR(12);
      V_DESCR_TABCAR CHAR(40);
      V_COD_ICMS CHAR(20);
      V_NEW_VALUE CHAR(2);

      e este é o update a ser realizado

      update cadmat set descr_mat_cadmat = ‘teste de trigger’ where cod_mat_cadmat = ‘00246’;

      o erro aparece na declaração desta variável V_COD_CADMAT CHAR(12); …. já tentei colocar varchar2, char de(40) e não funciona… se alguem puder me ajudar ficaria muito grato

      Atenciosamente
      Lucas Alves

      #90116
      Avatar photoLeonardo Litz
      Participante

        Olá Lucas,

        Tente utilizar a tipagem desta variavel por herança, V_COD_CADMAT%CADMAT.cod_mat_cadmat%TYPE.

        Oque mais esta trigger faz?

        Vlw Leonardo Litz

        #90117
        vieira
        Participante

          Olá leonardo, obrigado pela atenção….

          Eu já tinha testado também oque você falow ^^ hahaa, mas também nao funcionou, não se se ajuda mas vou postar a trigger toda abaixo

          CREATE OR REPLACE TRIGGER tgr_GeraCodServico

          BEFORE INSERT OR UPDATE

          ON CADMAT

          REFERENCING NEW AS novo_campo

          FOR EACH ROW

          DECLARE
          Pragma Autonomous_Transaction;

          V_COD_CADMAT CADMAT.cod_mat_cadmat%TYPE;
          V_DESCR_TABCAR CHAR(40);
          V_COD_ICMS CHAR(20);
          V_NEW_VALUE CHAR(2);

          BEGIN

          SELECT COD_MAT_CADMAT INTO V_COD_CADMAT FROM CADMAT WHERE COD_MAT_CADMAT = :novo_campo.COD_MAT_CADMAT;

          SELECT DESCR_MAT_CADMAT INTO V_DESCR_TABCAR FROM CADMAT WHERE COD_MAT_CADMAT = :novo_campo.COD_MAT_CADMAT;

          SELECT COD_ICMS_RET_CADMAT INTO V_COD_ICMS FROM CADMAT WHERE COD_MAT_CADMAT = V_COD_CADMAT;

          SELECT CASE
          WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 33 AND (MAX( ASCII(SUBSTR (COD_TABCAR,2,3)))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2 ) || CHR ( MAX(ASCII(SUBSTR (COD_TABCAR,2,3))))
          WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 33 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 35 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 35 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) < 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3)) + 1))

                  WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 38 AND  MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2)
                  WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 38 AND  MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) &lt; 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3))))
                  WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) &gt;= 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) &lt; 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) &lt; 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX(ASCII(SUBSTR (COD_TABCAR,2,3))) + 1)
          
                  WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 95 AND  MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2 ) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3))))
                  WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 95 AND  MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 97 AND MAX(ASCII(SUBSTR (COD_TABCAR,0,2))) = 97 AND MAX(ASCII(SUBSTR (COD_TABCAR,0,2))) &lt; 125 AND MAX(ASCII(SUBSTR(COD_TABCAR,2,3))) &lt; 125 THEN CHR(MAX(ASCII(SUBSTR(COD_TABCAR,0,2)))) || CHR(MAX(ASCII(SUBSTR (COD_TABCAR,2,3))) + 1) 
             END COD_TABCAR INTO V_NEW_VALUE FROM TABCAR;
          

          IF V_COD_ICMS = ' ' THEN

          INSERT INTO TABCAR VALUES(V_NEW_VALUE , V_DESCR_TABCAR);       
          UPDATE CADMAT SET COD_ICMS_RET_CADMAT = V_NEW_VALUE WHERE COD_MAT_CADMAT = V_COD_CADMAT;
          

          END IF ;
          commit;
          END tgr_GeraCodServico;

          Deixa eu explicar mais ou menos a Trigger:
          Objetivo: verificar qual o ultimo item existente na TABCAR, e adicionar mais um, de acordo com a tabela ASCII lá ….

          Grato desde já
          Lucas

          #90118
          Avatar photoLeonardo Litz
          Participante

            Olá Lucas,

            Verifique a tipagem da segunda coluna da tabela TABCAR, veja se esta igual a coluna DESCR_MAT_CADMAT da tabela CADMAT.

            Fiz algumas modificações em sua trigger:

            CREATE OR REPLACE TRIGGER tgr_GeraCodServico

            BEFORE INSERT OR UPDATE

            ON CADMAT

            REFERENCING NEW AS novo_campo

            FOR EACH ROW

            DECLARE
            Pragma Autonomous_Transaction;

            V_COD_CADMAT CADMAT.cod_mat_cadmat%TYPE;
            V_DESCR_TABCAR CADMAT.DESCR_MAT_CADMAT%TYPE;
            V_COD_ICMS CADMAT.COD_ICMS_RET_CADMAT%TYPE;
            V_NEW_VALUE CADMAT.COD_ICMS_RET_CADMAT%TYPE;

            BEGIN

            SELECT COD_MAT_CADMAT, DESCR_MAT_CADMAT, COD_ICMS_RET_CADMAT
            INTO V_COD_CADMAT, V_DESCR_TABCAR, V_COD_ICMS
            FROM CADMAT
            WHERE COD_MAT_CADMAT = :novo_campo.COD_MAT_CADMAT;

            /*SELECT DESCR_MAT_CADMAT INTO V_DESCR_TABCAR FROM CADMAT WHERE COD_MAT_CADMAT = :novo_campo.COD_MAT_CADMAT;

            SELECT COD_ICMS_RET_CADMAT INTO V_COD_ICMS FROM CADMAT WHERE COD_MAT_CADMAT = V_COD_CADMAT; */

            SELECT CASE
            WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 33 AND (MAX( ASCII(SUBSTR (COD_TABCAR,2,3)))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2 ) || CHR ( MAX(ASCII(SUBSTR (COD_TABCAR,2,3))))
            WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 33 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 35 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 35 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) < 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3)) + 1))

            WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2)
            WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3))))
            WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) >= 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) < 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX(ASCII(SUBSTR (COD_TABCAR,2,3))) + 1)

            WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 95 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2 ) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3))))
            WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 95 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 97 AND MAX(ASCII(SUBSTR (COD_TABCAR,0,2))) = 97 AND MAX(ASCII(SUBSTR (COD_TABCAR,0,2))) < 125 AND MAX(ASCII(SUBSTR(COD_TABCAR,2,3))) < 125 THEN CHR(MAX(ASCII(SUBSTR(COD_TABCAR,0,2)))) || CHR(MAX(ASCII(SUBSTR (COD_TABCAR,2,3))) + 1)
            END COD_TABCAR INTO V_NEW_VALUE FROM TABCAR;

            IF V_COD_ICMS = ' ' THEN

            INSERT INTO TABCAR VALUES(V_NEW_VALUE , V_DESCR_TABCAR);
            UPDATE CADMAT SET COD_ICMS_RET_CADMAT = V_NEW_VALUE WHERE COD_MAT_CADMAT = V_COD_CADMAT;
            END IF ;
            commit;
            END tgr_GeraCodServico;

            #90119
            vieira
            Participante

              Fiz a troca leonardo, a única variável que não da para pegar por herança eh a V_DESCR_TABCAR porque na tab car a descr_tabcar é char(40) e a descr_mat_cadmat é char(80) então eu tenho que limitar o tamanho dela……

              Oque ocorreu agora é, apareceu o mesmo erro, mas agora sempre dá o erro na linha 12….. independente se eu começar a trigger na linha 50, da erro na linha 12..achei mto estranho……abaixo o erro…

              ORA-06502: PL/SQL: numeric or value error: character string buffer too small
              ORA-06512: at “EFOOD_APETECE.TGR_GERACODSERVICO”, line 12
              ORA-04088: error during execution of trigger ‘EFOOD_APETECE.TGR_GERACODSERVICO’

              Grato…Leonardo eu te adicionei no msn, se possível me aceita lá, eu estou indo para casa as 18h…. no msn eh mais fácil de conversarmos…

              Abraços

              #90120
              Avatar photoLeonardo Litz
              Participante

                O pior que aqui não tenho msn… só anoite.. depois das 23h…

                Acho que pode ser isso:


                a única variável que não da para pegar por herança eh a V_DESCR_TABCAR porque na tab car a descr_tabcar é char(40) e a descr_mat_cadmat é char(80) então eu tenho que limitar o tamanho dela

                Se a tabela que esta recebendo as informações (insert lá embaixo) é menor que a tabela que esta fornecedo irá ocorrer este erro.
                Para testar coloque um substr(V_DESCR_TABCAR,1,40) no insert.
                Como vc mesmo disse, a V_DESCR_TABCAR não pode ser herdada, ela esta recebendo uma informação da tabela CADMAT que contem um tamanho de 80 posicoes, qual tamanho vc declarou esta variavel? 40 ou 80?

                Vlw Leonardo Litz

                #90121
                vieira
                Participante

                  Pra variar deu o mesmo erro ahahah, to achando q a máquina está viciada…. Eu declarei com 40 porque a descr vai ser inserida na tabcar, e na tabcar eh char(40), como na declaração ja esta char de 40 ele pega só as primeiras 40 posições,….

                  Será que pode ser outra coisa que esta gerando o erro ? antes o erro que estava dando é era…


                  ORA-04091: table EFOOD_APETECE.CADMAT is mutating, trigger/function may not see it
                  ORA-06512: at "EFOOD_APETECE.TGR_GERACODSERVICO", line 13
                  ORA-04088: error during execution of trigger 'EFOOD_APETECE.TGR_GERACODSERVICO'

                  ai eu coloquei esta linha, que evita dar esse erro de mutação na tabela…


                  Pragma Autonomous_Transaction;

                  foi ai que começou a dar este erro de tamanho do campo ai….

                  Abaixo vou enviar minha trigger quando ainda estava dando o erro de mutação na tabela, não sei qual erro é menos difícil de resolver ^^


                  CREATE OR REPLACE TRIGGER tgr_GeraCodServico

                  BEFORE INSERT OR UPDATE

                  ON CADMAT

                  REFERENCING NEW AS novo_campo

                  FOR EACH ROW

                  DECLARE

                  V_NEW_VALUE CHAR(2);
                  V_COD_CADMAT CADMAT.COD_MAT_CADMAT%type;
                  V_DESCR_TABCAR CHAR(40);
                  V_COD_ICMS CHAR(5);

                  BEGIN

                  select :novo_campo.COD_MAT_CADMAT, :novo_campo.DESCR_MAT_CADMAT into V_COD_CADMAT, V_DESCR_TABCAR from dual;

                  SELECT COD_ICMS_RET_CADMAT INTO V_COD_ICMS FROM CADMAT WHERE COD_MAT_CADMAT = V_COD_CADMAT;

                  SELECT CASE
                  WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 33 AND (MAX( ASCII(SUBSTR (COD_TABCAR,2,3)))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2 ) || CHR ( MAX(ASCII(SUBSTR (COD_TABCAR,2,3))))
                  WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 33 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 35 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 35 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) < 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3)) + 1))

                          WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 38 AND  MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2)
                          WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 38 AND  MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) &lt; 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3))))
                          WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) &gt;= 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) &lt; 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) &lt; 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX(ASCII(SUBSTR (COD_TABCAR,2,3))) + 1)
                  
                          WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 95 AND  MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2 ) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3))))
                          WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 95 AND  MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 97 AND MAX(ASCII(SUBSTR (COD_TABCAR,0,2))) = 97 AND MAX(ASCII(SUBSTR (COD_TABCAR,0,2))) &lt; 125 AND MAX(ASCII(SUBSTR(COD_TABCAR,2,3))) &lt; 125 THEN CHR(MAX(ASCII(SUBSTR(COD_TABCAR,0,2)))) || CHR(MAX(ASCII(SUBSTR (COD_TABCAR,2,3))) + 1) 
                     END COD_TABCAR INTO V_NEW_VALUE FROM TABCAR;
                  

                  IF V_COD_ICMS = ' ' THEN
                  INSERT INTO TABCAR VALUES(V_NEW_VALUE, V_DESCR_TABCAR);
                  UPDATE CADMAT SET COD_ICMS_RET_CADMAT = V_NEW_VALUE WHERE COD_MAT_CADMAT = V_COD_CADMAT;
                  END IF ;

                  END trg_GeraCodServico;

                  Abraços

                  #90122
                  Avatar photoLeonardo Litz
                  Participante

                    Então Lucas….

                    Creio que seja por causa do tamanho dos campos nas tabelas que estão diferentes, para teste você não pode aumentar os dois campos de descrição para 80 posicoes (não se esqueca de herdar a tipagem da variavel V_DESCR_TABCAR )?

                    Vlw Leonardo Litz

                    #90123
                    vieira
                    Participante

                      OPA, criei outra tabela porque aki no trampo eh embaçado mudar a estrutura da tabela, mas enfim, mudou o erro pelomenos…


                      ORA-00060: deadlock detected while waiting for resource
                      ORA-06512: at "EFOOD_APETECE.TGR_GERACODSERVICO", line 48
                      ORA-04088: error during execution of trigger 'EFOOD_APETECE.TGR_GERACODSERVICO'

                      Como estou indo embora, amanha irei procurar sobre ele no google, caso alguem saiba como me ajudar, agradeço, abaixo segue trigger atualizada ok!… Valew ai até agora …


                      CREATE OR REPLACE TRIGGER tgr_GeraCodServico

                      BEFORE INSERT OR UPDATE

                      ON CADMAT

                      REFERENCING NEW AS novo_campo

                      FOR EACH ROW

                      DECLARE
                      Pragma Autonomous_Transaction;

                      V_COD_CADMAT CADMAT.cod_mat_cadmat%TYPE;
                      V_DESCR_TABCAR CADMAT.DESCR_MAT_CADMAT%TYPE;
                      V_COD_ICMS CADMAT.COD_ICMS_RET_CADMAT%TYPE;
                      V_NEW_VALUE CADMAT.COD_ICMS_RET_CADMAT%TYPE;

                      BEGIN

                      SELECT COD_MAT_CADMAT, DESCR_MAT_CADMAT, COD_ICMS_RET_CADMAT
                      INTO V_COD_CADMAT, V_DESCR_TABCAR, V_COD_ICMS
                      FROM CADMAT
                      WHERE COD_MAT_CADMAT = :novo_campo.COD_MAT_CADMAT;

                      SELECT CASE
                      WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 33 AND (MAX( ASCII(SUBSTR (COD_TABCAR,2,3)))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2 ) || CHR ( MAX(ASCII(SUBSTR (COD_TABCAR,2,3))))
                      WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 33 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 35 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 35 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) < 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3)) + 1))

                      WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2)
                      WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3))))
                      WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) >= 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) < 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX(ASCII(SUBSTR (COD_TABCAR,2,3))) + 1)

                      WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 95 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2 ) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3))))
                      WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 95 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 97 AND MAX(ASCII(SUBSTR (COD_TABCAR,0,2))) = 97 AND MAX(ASCII(SUBSTR (COD_TABCAR,0,2))) < 125 AND MAX(ASCII(SUBSTR(COD_TABCAR,2,3))) < 125 THEN CHR(MAX(ASCII(SUBSTR(COD_TABCAR,0,2)))) || CHR(MAX(ASCII(SUBSTR (COD_TABCAR,2,3))) + 1)
                      END COD_TABCAR INTO V_NEW_VALUE FROM TABCAR;

                      IF V_COD_ICMS = ' ' THEN

                      INSERT INTO TABCAR_DUMMY VALUES(V_NEW_VALUE , V_DESCR_TABCAR);
                      UPDATE CADMAT SET COD_ICMS_RET_CADMAT = V_NEW_VALUE WHERE COD_MAT_CADMAT = V_COD_CADMAT;
                      END IF ;
                      commit;
                      END tgr_GeraCodServico;

                      #90124
                      Ishii
                      Participante

                        Olá,

                        Como a declaração das variáveis segue a estrutura da tabela o erro não ocorre mais, porém o deadlock me parece ser por conta do último update na mesma tabela.

                        Acho que somente

                        :new.COD_ICMS_RET_CADMAT := V_NEW_VALUE;

                        deveria resolver….

                        []s Ishii

                        #90126
                        vieira
                        Participante

                          Ishii, obrigado pela atenção!
                          Não consegui implementar a linha de comando que você postou, é no lugar deste update que é para por esta linha ?

                          UPDATE CADMAT SET COD_ICMS_RET_CADMAT = V_NEW_VALUE WHERE COD_MAT_CADMAT = V_COD_CADMAT;

                          Obriado a todos
                          Lucas Alves

                          #90136
                          vieira
                          Participante

                            Galera, creio que não vá funcionar, vejam se estou certo…

                            A trigger é chamada quando há uma alteração na cadmat, acontece q, eu faço um update na cadmat por exemplo, a trigger é chamada, faz o select e o insert INSERT INTO TABCAR_DUMMY VALUES(V_NEW_VALUE , V_DESCR_TABCAR);

                            depois deste insert ela vai fazer o update: UPDATE CADMAT SET COD_ICMS_RET_CADMAT = V_NEW_VALUE WHERE COD_MAT_CADMAT = V_COD_CADMAT;
                            acontece que, este update faz uma alteração na cadmat, e quando a cadmat sofre inserção ou update a trigger é chamada, ou seja, não sai do loop….
                            ai da esse erro de deadlock ORA-00060: deadlock detected while waiting for resource
                            ORA-06512: at "EFOOD_APETECE.TGR_GERACODSERVICO", line 44
                            ORA-04088: error during execution of trigger 'EFOOD_APETECE.TGR_GERACODSERVICO'

                            Alguem SABERIA se há alguma solução para faze-lo em uma trigger apenas ?… no SQL funciona mas porque o SQL não precisa do commit…

                            Atenciosamente…

                            #90138
                            fsitja
                            Participante

                              Daria, se você usasse uma de duas alternativas:

                              Você está usando Pragma Autonomous_Transaction de forma imprópria, pois ele não foi feito para atualizar a mesma tabela que a trigger está disparando.

                              Dê uma lida nos links acima, e mande suas dúvidas.

                              #90141
                              vieira
                              Participante

                                Obrigado fsitja, vou dar uma olhada nos links que você postou e depois posto minhas dúvidas, obrigado até agora a todos ;….;

                                #90142
                                Ishii
                                Participante

                                  [quote=”vieira”:3psapa8u]Ishii, obrigado pela atenção!
                                  Não consegui implementar a linha de comando que você postou, é no lugar deste update que é para por esta linha ?

                                  UPDATE CADMAT SET COD_ICMS_RET_CADMAT = V_NEW_VALUE WHERE COD_MAT_CADMAT = V_COD_CADMAT;

                                  Obriado a todos
                                  Lucas Alves[/quote]

                                  Opa, desculpe-me a demora…

                                  Sim, você teria que substituir esse comando do Update pelo

                                  :new.COD_ICMS_RET_CADMAT := V_NEW_VALUE;

                                  Se isso não funcionou, coloque o erro para podermos analisar.

                                  []s Ishii

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