No Oracle, quando você tenta descartar uma tabela temporária global que está em uso, obtém a seguinte exceção:
ORA-14452: tentativa de criar, alterar ou descartar um índice na tabela temporária já em uso
Isso é causado por uma sessão que está usando o GTT em uma transação atual. Existe uma maneira de consultar o dicionário de dados para determinar quais sessões estão bloqueando a queda? Sei que posso obter as sessões com transações em andamento com algo assim, mas gostaria de restringir ainda mais.
select * from v$session
where session_id in (select session_id from dba_locks where lock_type='Transaction');
A(s) sessão(ões) que usam a tabela temporária podem ser consultadas como:
Em seguida, você pode matar essas sessões ou fazer com que liberem os bloqueios normalmente.
Aqui está o que acontece:
Quando você cria uma tabela temporária global com a cláusula "on commit preserve rows", a tabela será bloqueada até que você reinicie o banco de dados. Eu tive esse problema recentemente e consegui reproduzi-lo. Criei um artigo simples descrevendo (em português mas os comandos estão em inglês):
https://guilhermemesquitadba.wordpress.com/2015/07/15/ora-14450-attempt-to-access-a-transactional-temp-table-already-in-use/
Além disso, você não poderá consultar a sessão, pois ela é interna ao Oracle e não é uma sessão comum.