-

Um erro que pode incomodar bastante durante a atualização de uma tabela temporária é o :

ORA-14450: attempt to access a transactional temp table already in use

A mensagem apesar de clara pode ser difícil de tratar caso você não consiga identificar e/ou derrubar todas as sessões conectadas. Dessa forma, caso deseje “forçar” a alteração de uma tabela desse tipo, siga os seguintes passos:

  1. Execute o comando
    lock table <SCHEMA>.<TABELA_TEMPORARIA> in exclusive mode;
  2. Desconecte da sessão e conecte novamente no Banco (Ex: utilizando Sql Tools ou PLSQL Developer)
  3. Após conectado execute a seguinte Query:
    SELECT * FROM v$lock WHERE id1 = (SELECT object_id FROM all_objects WHERE owner =<SCHEMA> AND object_name =<TABELA_TEMPORARIA>);
    
  4. Ao identificar uma linha nesse select, vamos proceder “matando” a sessão:
    ALTER SYSTEM KILL SESSION '<sid>,<serial#>';
  5. Depois de executado o comando KILL e confirmado sua execução com sucesso, você poderá executar o comando DDL desejado:
    ALTER TABLE <SCHEMA>.<TABELA_TEMPORARIA> MODIFY(COLUNA NUMBER (20,0));
  6. Por fim, libere o lock realizado no passo1 através do comando:
    rollback;

E só 😉

4 replies on “Como resolver ORA-14450: attempt to access a transactional temp table already in use Tabela temporária Oracle”

Leave a Comment
  1. E quando não há nenhuma sessão e o problema persiste?
    Estou com um BD que apenas eu uso. Mesmo assim, pedi ao DBA que matasse qualquer sessão existente (que por erro tivesse ficado presa, não sei…). Ele me garante que não há nada… mas o erro persiste. Que fazer ?

  2. Muito bom!
    Resolveu meu problema para processos acessando temporary table.
    Abaixo a query que usei:

    SELECT ‘alter system disconnect session ”’||l.sid||’,’||s.serial#||”’ immediate;’ “COMANDO1″
    , ‘alter system kill session ”’||l.sid||’,’||s.serial#||”’;’ “COMANDO2”
    , s.USERNAME
    , s.STATUS
    , s.OSUSER
    FROM gv$lock l
    , gv$session s
    WHERE l.id1 = (SELECT o.object_id FROM all_objects o WHERE o.owner = ‘SGC’ AND o.object_name = ‘SC_TMP_GERAL’)
    AND l.sid = s.sid;

  3. Perfeito. Muito obrigado!

  4. De nada!

Leave a Comment

Your email address will not be published.

You may use these HTML tags and attributes: <a href=""> <abbr> <acronym> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Send a Message