Pular para o conteúdo
  • Este tópico contém 3 respostas, 4 vozes e foi atualizado pela última vez 17 anos atrás por Marcio68Almeida.
Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #85568
    Tytto
    Participante

      Tenho um procedimento que trunca uma tabela. No decorrer dessa porocedure, eu populo e abro essa tabela novamente em um cursor. Quando vai fazer o fetch dos registros ocorre esse erro.

      Porém, se ao invés de usar o truncate, eu usar o delete, funciona perfeitamente… ou seja,
      se substituir a linha: EXECUTE IMMEDIATE ‘TRUNCATE TABLE TTT
      por DELETE FROM TTT funciona perfeitamente.

      Por que está acontecendo esse erro?

      Leandro.

      #85576
      David Siqueira
      Participante

        Tem como postar a proc pra gente ver esse caso parceiro???..

        Abcs.

        David

        #85578
        Rodrigo Almeida
        Participante

          Simples pelos conceitos do Oracle.

          Quando você faz um DELETE, ele não movimenta os extentds da tabela que estão abaixo da marca dágua, e com isso utiliza a área de UNDO, e consequentemente, tu consegue tem um PONTO DE “RESTAURAÇÃO” dos dados, ou seja, se fizer ROLLBACK os dados conseguem se agrupar novamente.

          Porém, quando se realiza um TRUNCATE, a marca dágua é digamos “reduzida” e com isso, a tabela sofre alterações físicas, e com isso tu não consegue voltar os dados da maneira que estava anteriormente, pois a tabela sofreu uma regressão da marca dágua, por isso que para comandos de TRUNCATE não existe COMMIT ou ROLLBACK, você elimina os dados mesmo!

          E o erro que está aparecendo para ti, é por causa disso, esse truncate na verdade só deve estar em algum momento errado na transação, pq os dados podem estar sendo utilizados por outra transação, pois ocorre um problema de READ CONSISTENT, ou seja, existe alguma outra transação que deve estar lendo os dados dessa tabela e os dados que você quer manipular deveriam ir para UNDO (Data Buffer Cache e etc) para posteriormente você emitir um comando de DCL (Commit ou Rollback) e efetivar os dados alterados, a transação que estaria lendo os dados estaria com os dados consistentes ou no Dirty Buffer.

          E como ocorrer esse tipo de controle nas transações, ao emitir o seu TRUNCATE, você REALMENTE elimina os dados que podem estar sendo utilizado por outra transação e consequentemente gera esse erro ORA.

          Abraços,
          Rodrigo Almeida

          #85579
          Marcio68Almeida
          Participante

            Por que você não usa tabela temporária ???

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