Oracle:删除所有符合条件的表空间

san*_* mk 3 sql oracle

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

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

SELECT TABLESPACE_NAME FROM DBA_DATA_FILES WHERE FILE_NAME LIKE '/vol1/u06%' ;
Run Code Online (Sandbox Code Playgroud)

我想删除上述查询返回的所有表空间。但是我无法弄清楚外部查询应该如何,因为DROP TABLESPACE它没有WHERE子句。
因此,外部查询应该看起来像DROP TABLESPACE tablespace_name.....tablespace_name来一个接一个从上面的图案匹配的查询。

(我正在使用Oracle)

谢谢!

Jor*_*pos 5

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

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;
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。实际上,我现在使用稍长的方法删除了表空间。我在文本文件中输出表空间列表。然后,我使用“ awk”将查询的其余部分附加到该文本文件的每一行的左侧和右侧。因此,文本文件现在包含具有每个表空间名称的放置查询。 (2认同)