在 Oracle 中,当您尝试删除正在使用的全局临时表时,会出现以下异常:
ORA-14452: 尝试在已使用的临时表上创建、更改或删除索引
这是由在当前事务中使用 GTT 的会话引起的。有没有办法查询数据字典以确定哪些会话阻止了丢弃?我知道我可以通过这样的方式获得正在进行的交易的会话,但我想进一步缩小范围。
select * from v$session
where session_id in (select session_id from dba_locks where lock_type='Transaction');
使用临时表的会话可以查询为:
然后您可以终止这些会话或让它们优雅地释放锁。
这是发生的事情:
当您使用“on commit preserve rows”子句创建全局临时表时,表将被锁定,直到您重新启动数据库。我最近遇到了这个问题,并且能够重现它。我创建了一篇描述它的简单文章(葡萄牙语,但命令是英语):
https://guilhermemesquitadba.wordpress.com/2015/07/15/ora-14450-attempt-to-access-a-transactional-temp-table-already-in-use/
此外,您将无法查询会话,因为它是 Oracle 内部的,并且不是通用会话。