【问题标题】:Oracle: Drop all tablespaces that meet a conditionOracle:删除所有满足条件的表空间
【发布时间】:2014-07-02 16:08:39
【问题描述】:

我想删除我的数据库中在其数据文件名称中具有特定模式的所有表空间。

以下查询为我提供了数据文件名遵循此模式的所有表空间:

SELECT TABLESPACE_NAME FROM DBA_DATA_FILES WHERE FILE_NAME LIKE '/vol1/u06%' ;

我想删除上述查询返回的所有表空间。但我无法弄清楚外部查询应该是怎样的,因为DROP TABLESPACE 不采用WHERE 子句。
因此,外部查询应类似于 DROP TABLESPACE tablespace_name.....,其中 tablespace_name 与上述模式匹配查询一一对应。

(我正在使用 Oracle)

谢谢!

【问题讨论】:

  • 您可以使用立即执行语句制作一个 PLsql 块。
  • 你能给我举一些这种用法的例子吗?
  • 在这个问题上,stackoverflow.com/questions/6180710/… 正是您要问的。
  • 您只需将其更改为 FOR 语句,而不是使用计数的测试。
  • 但是如何将变量表空间名称传递给第二个查询?名称可以从第一个查询中获得。这是关键问题..

标签: sql oracle


【解决方案1】:

这是您需要的。但是我不建议这样做,因为在这样的动态脚本中删除表空间可能很危险。

BEGIN
   FOR rs in (SELECT TABLESPACE_NAME 
                FROM DBA_DATA_FILES WHERE FILE_NAME LIKE '/vol1/u06%')  LOOP
      BEGIN
         EXECUTE IMMEDIATE 'DROP TABLESPACE ' || rs.TABLESPACE_NAME || ' INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS';
      END;
   END LOOP;
END;

【讨论】:

  • 谢谢。实际上,我现在使用稍微长一点的方法删除了表空间。我在文本文件中输出表空间列表。然后我使用 'awk' 将查询的剩余部分附加到该文本文件每一行的左侧和右侧。所以文本文件现在包含一个带有每个表空间名称的删除查询。
猜你喜欢
  • 2016-12-04
  • 1970-01-01
  • 2017-09-16
  • 2019-02-13
  • 2021-12-26
  • 2011-11-02
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
相关资源
最近更新 更多