在 SQL Developer 中删除临时表
Posted
技术标签:
【中文标题】在 SQL Developer 中删除临时表【英文标题】:Dropping Temporary Tables in SQL Developer 【发布时间】:2014-11-18 15:27:36 【问题描述】:我正在使用 SQL Developer,并且正在使用全局临时表。问题是当我结束会话时临时表没有完全删除。在打开一个新会话时,所有“临时”表都列在我的模式下(它们不包含数据,只显示列是什么,它们有一个带 x 的灰色圆圈)。
我不得不手动删除每个表,这非常耗时。 SQL 开发人员中是否有设置或快速代码在每次会话后永久删除临时表?
或者更好的是,在我的会话期间删除表格的方法? (如果我尝试这样做,我会收到错误“尝试在已使用的临时表上创建、更改或删除索引。”)
谢谢!
【问题讨论】:
我找到了答案...首先你必须 TRUNCATE TABLE TABLENAME;那么你可以 DROP TABLE TABLENAME;. 如果您的设计需要删除全局临时表,那么您的设计是错误的。如果您的设计需要截断它们,那么您的设计可能是错误的。 【参考方案1】:抛开关于删除和重新创建临时表的问题,这是一个删除架构中所有临时表的脚本:
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 操作,因此在此操作之前发生的任何事情都会被提交。
【讨论】:
【参考方案2】:这就是全局临时表在 Oracle 中的工作方式。
它们始终存在(例如,在系统目录中),您只需创建一次(不是每次使用它们时)。
我不得不手动删除每个表,这真的很耗时。
您不必删除它们 - 这就是 global 临时表的全部意义所在。
每个会话在该表中都有自己的数据副本。当您提交或断开连接时,数据将被“删除”(取决于您创建 GTT 的方式)。
或者更好的是,在我的会话期间删除表格的方法?
你不需要那个。把它们放在身边并使用它们。
【讨论】:
我确实需要能够删除它们...我每天可能会写 25 次代码,并希望它们永远消失。不得不为每张桌子取新名字已经过时了。我希望能够做通用的“TBL1”然后删除它,然后使用“TBL1”做其他事情。我不是在谈论完善,将所有数据按照我想要的方式保存在表格中,我在谈论我作为草稿编写的表格,试图按照我想要的方式获取数据。一旦粗略的草稿表对我来说毫无用处,我如何在不必关闭会话然后手动删除表的情况下让它消失? 这一切听起来好像您设计表和使用临时表的方法是错误的(或者至少不是应该在 Oracle 中使用 GTT)。为什么你首先需要它们?在 Oracle 中,使用临时表非常并不常见。大多数时候,简单地使用派生表/子选择/公用表表达式就可以了。 Oracle 不是 SQL Server。 你可能是对的,可能有比 GTT 更好的方法来完成我想要完成的工作,我只是不知道......我需要一个临时表来保存我以后需要的大量信息/计算。例如,现在我有 7 个临时表,其中包含各种数据,而我的最终选择语句从这 7 个表中的每一个中提取计数和计算。明天,我可能想要这 7 个表中的不同数据和相同的计算,并且我正在尝试找到一种方法来删除我今天使用的表。以上是关于在 SQL Developer 中删除临时表的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 中删除全局临时表 (##tempTable)