Pular para o conteúdo
Visualizando 6 posts - 1 até 6 (de 6 do total)
  • Autor
    Posts
  • #82874
    Anônimo

      Bom dia srs,

      Estou construindo uma trigger na qual antes de atualizar/deletar um registro, tenho que dar um select na própria tabela que está sendo modificada, devido a executar joins em outras tabelas.

      Minha dúvida é:

      Como não posso executar uma instrução que necessito na tabela que está sendo alterada (ver erro abaixo), onde posso “armazenar” o registro em questão numa estrutura na qual possa dar joins em outras tabelas existentes???

      Se eu colocar em um tipo de collection, posso fazer isto:

      select
      t1.a,
      t1.b,
      t1.c,
      type_collection.a,
      type_collection.b
      from
      t1
      inner join type_collection ….

      ERRO:
      —————————————————————–

      UPDATE WEB.”CLIENTES” SET DAT_COMPRA = TO_DATE(’21/02/08′, ‘DD/MM/RR’) WHERE ROWID = ‘AAAKVQAAQAABpu9AAN’

      One error saving changes to table WEB.”CLIENTES”:
      Row 1: ORA-04091: table WEB.CLIENTES is mutating, trigger/function may not see it
      ORA-06512: at “WEB.TRG_CLIENTES”, line 58
      ORA-06512: at “WEB.TRG_CLIENTES”, line 204
      ORA-04088: error during execution of trigger ‘WEB.TRG_CLIENTES’

      —————————————————————–

      Att,

      #82876
      Marcio68Almeida
      Participante

        você pode usar os atributos :NEW e :OLD para essa consulta…

        #82879
        Ishii
        Participante

          Olá,

          Se você precisar mesmo fazer um select na própria tabela da trigger você pode utilizar também o parâmetro

          PRAGMA AUTONOMOUS_TRANSACTION

          Ele vai permitir que você faça o select – join com a própria tabela.

          Outra opção, caso o BD seja inferior ao 8.1.0 é utilizar o execute immediate …

          []s Ishii

          #82884
          Anônimo

            Ola a todos,

            obrigado pelas dicas.

            O “problema” de eu utilizar :NEW/:OLD é que teria que fazer um select assim (tabelas/nomes de campos apenas de exemplo):

            SELECT
            CLIENTES.NOME,
            CLIENTES.DT_NASC,
            CLIENTES_ENDERECOS.BAIRRO,
            CLIENTES_TELEFONES.DDD
            FROM
            CLIENTES — tabela principal, que tenho que dar o join devido a outras tabelas auxiliares, “…table is mutating”
            INNER JOIN CLIENTES_ENDERECOS
            ON CLIENTES.COD_CLIENTE = CLIENTES_ENDERECOS.COD_CLIENTE
            INNER JOIN CLIENTES_TELEFONES
            ON CLIENTES.COD_CLIENTE = CLIENTES_TELEFONES.COD_CLIENTE
            WHERE

            e consequentemente me gerando este erro.

            Meu bd aqui é o 9i.

            Vou testar estas opçções citadas e posto aqui novamentente.

            grato

            #82892
            Anônimo

              Inclui esta opção de ‘PRAGMA AUTONOMOUS_TRANSACTION;’ na minha trigger, e o select que eu precisava executar está, ok. Muito interessante esta opção.

              Obrigado pessoal.

              #82896
              Ishii
              Participante

                Olá,

                Para complementar o uso do PRAGMA AUTONOMOUS_TRANSACTION:

                Quando for utilizar para fazer uma referência na própria tabela da trigger e depois um comando DML (insert, update ou delete) deve-se por um commit na trigger. Isso parece meio estranho mas é que esse comando abre uma nova sessão para executar a query da tabela da trigger, por isso o commit, para que seja “finalizada” a sessão.

                []s Ishii

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