我正在使用 SQL Developer 并且正在使用全局临时表。问题是当我结束会话时临时表没有完全删除。在打开一个新会话时,所有“临时”表都列在我的模式下(它们不包含数据,只显示列是什么,它们有一个带 x 的灰色圆圈)。
我不得不手动删除每个表,这非常耗时。SQL 开发人员中是否有设置或快速代码在每次会话后永久删除临时表?
或者更好的是,在我的会话期间删除表格的方法?(如果我尝试这样做,我会收到错误消息“尝试在已使用的临时表上创建、更改或删除索引。”)
谢谢你!
我正在使用 SQL Developer 并且正在使用全局临时表。问题是当我结束会话时临时表没有完全删除。在打开一个新会话时,所有“临时”表都列在我的模式下(它们不包含数据,只显示列是什么,它们有一个带 x 的灰色圆圈)。
我不得不手动删除每个表,这非常耗时。SQL 开发人员中是否有设置或快速代码在每次会话后永久删除临时表?
或者更好的是,在我的会话期间删除表格的方法?(如果我尝试这样做,我会收到错误消息“尝试在已使用的临时表上创建、更改或删除索引。”)
谢谢你!
这就是全局临时表在 Oracle 中的工作方式。
它们总是存在的(例如在系统目录中),您只需要创建一次(不是每次使用它们时)。
我不得不手动删除每个表,这非常耗时。
您不必删除它们 - 这就是全局临时表的全部意义所在。
每个会话在该表中都有自己的数据副本。当您提交或断开连接时,数据将被“删除”(取决于您创建 GTT 的方式)。
或者更好的是,在我的会话期间删除表格的方法?
你不需要那个。把它们放在身边并使用它们。
撇开关于删除和重新创建临时表的问题不谈,这里有一个脚本可以删除架构中的所有临时表:
begin
for x in (select 'drop table ' || table_name || '' s from user_tables
where temporary = 'Y')
loop
execute immediate x.s;
end loop;
end;
/
如果你使用一些前缀,你可以添加它以避免丢失一些有用的东西:
begin
for x in (select 'drop table ' || table_name || '' s from user_tables
where temporary = 'Y'
and table_name like 'dropme%')
loop
execute immediate x.s;
end loop;
end;
/
请记住,创建/删除临时表是 DDL 操作,因此在此操作之前发生的任何事情都将被提交。