Oracle | 删除表

3

我想在一个表空间中删除某些表,这些表的名称都有共同的后缀,例如:

TABLE1_NAME1_COMMON
TABLE2_NAME2_COMMON
TABLE3_NAME3_COMMON

我听说过Oracle函数,但并不太熟悉,所以希望得到一些帮助。

谢谢。

3个回答

9
如果你完全确定自己在做什么,也就是说,你确定不会意外删除不想删除的表,那么可以执行以下操作:

set serveroutput on size 1000000

begin
for r in (

  select table_name 
    from user_tables 
   where table_name like '%\_COMMON' escape '\')

loop

  execute immediate 'drop table ' || r.table_name;

end loop;
exception when others then
   dbms_output.put_line(sqlerrm);
end;
/

编辑

  1. 现在选择从user_tables而不是dba_tables,因为这样似乎更安全。
  2. 添加set serveroutput on,以便打印dbms_output.put_line
  3. 添加begin .. exception .. end以显示错误。

我可以问一下这是PL/SQL的事情吗?还是一个函数? - Ascendant
1
@PerfectGundam:如果你在提到execute immediate...结构,那么这是一种 "PL/SQL 东西",它允许调用动态 PL/SQL。 - René Nyffenegger
啊,谢谢。我只是在想它是否可以以类似的形式用于不同的DBMS。 - Ascendant

3

你可以在一个过程中完成这个操作,但最好的方法是仅选择那些DROP语句,审核它们并手动执行:

SELECT 'DROP TABLE ' || table_name || ';'
FROM user_tables
WHERE table_name LIKE '%\_COMMON' ESCAPE '\';

将返回

DROP TABLE TABLE1_NAME1_COMMON;
DROP TABLE TABLE2_NAME2_COMMON;
DROP TABLE TABLE3_NAME3_COMMON;

0

要识别它们,你可以使用以下方法:

SELECT * FROM user_tables WHERE tablespace_name='MySpace' AND table_name like '%COMMON';

你可以使用SELECT语句来派生DROP语句。或者,你可以编写一个PL/SQL函数来循环遍历“公共表”,并使用EXECUTE IMMEDIATE命令将它们删除。

但是,在进行选择之前,请确保你已经百分之百确定了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接