【问题标题】:Oracle | drop table甲骨文 |删除表
【发布时间】:2011-03-16 11:24:55
【问题描述】:

例如,我想将某些表放在一个表空间中,该表空间的每个表末尾都附加了公用名:

TABLE1_NAME1_COMMON
TABLE2_NAME2_COMMON
TABLE3_NAME3_COMMON

我听说过 Oracle 函数,但我对这些函数不太熟悉,所以我期待一些帮助。

谢谢。

【问题讨论】:

    标签: sql database oracle plsql


    【解决方案1】:

    如果您完全确定自己在做什么,即,如果您确定不会意外删除不想删除的表,则可以执行以下操作:

    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 的事情?还是一个函数?
    • @PerfectGundam:如果您指的是execute immediate ... 构造,那么这是一个允许调用动态PL/SQL 的“PL/SQL 事物”。
    • 啊,谢谢,我只是想知道它是否可以以类似的形式用于不同的 DBMS。
    【解决方案2】:

    您可以在程序中执行此操作,但最好只选择那些 DROP-statements,查看它们并手动执行它们:

    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;
    

    【讨论】:

      【解决方案3】:

      您可以使用来识别它们:

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

      然后,您也可以使用 SELECT 派生 DROP 语句。或者您可以编写一个 PL/SQL 函数来遍历“公用表”并使用 EXECUTE IMMEDIATE 删除它们。

      不过,我会确保您首先 100% 确定选择。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多