在 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)

sql 删除临时(临时)SQL表(如果存在)

SQL SERVER2008里面sql语句删除临时表失败

Postgres 从动态 sql 字符串创建本地临时表(在提交删除时)

sql server 表变量表类型临时表

SQL Server删除库中所有临时表或用户表