2011-09-27 2 views
1

내 오라클 스콧 스키마가 같은 테이블 목록을 포함Oracle의 스키마에서 테이블 목록을 삭제하는 방법은 무엇입니까?

'prefix_A' 
'prefix_B' 
'prefix_C' 
'A' 
'B' 
'C' 

지금 내가 같은 테이블 접두사 '접두어 _'를 포함하는 테이블의 목록을 드롭 할, 그러나 다른 테이블의 A, B는 C가 동일하게 유지 될 것이다.

어떻게 가능합니까?

미리 감사드립니다.

+3

"삭제"라고 말하면 정말로 삭제합니까? 또는 DROP? 즉, 데이터를 지우거나 데이터 구조를 압축 할 수 있습니까? – APC

+0

안녕하세요 APC, DROP을 원하고 구조 및 데이터를 삭제하십시오. – DBTutor

답변

7

데이터 사전을 구동하는 동적 SQL을 사용하십시오.

begin 
    for trec in (select table_name 
        from user_tables 
        where table_name like 'PREFIX\_%' escape `\') 
    loop 
     dbms_output.put_line('dropping table ' || trec.table_name); 
     execute immediate 'drop table '||trec.table_name; 
    end loop; 
end; 

LIKE 절을 정확하게 사용하는 것이 좋습니다. 밑줄이 와일드 카드로 처리되지 않도록하려면 escape 키워드를 사용하십시오. 또는 substr(table_name, 1, 7) = 'PREFIX_'을 사용하십시오.

10g 이상 및 the RECYCLE BIN is enabled에서 작업하고 있다면 잘못된 테이블을 삭제하는 것이 큰 재앙이 아니지만, 여전히 더 나은 방법은 아닙니다. 분명히 프로덕션에서는 이와 같은 코드를 실행하지 않지만 드롭 구문의 스크립트를 생성하는 원리를 사용합니다.

위의 코드는 종속성을 처리하지 않습니다. 당신이 접두사 테이블을 참조하는 외래 키가 있고 테이블의 낙하를 강제하려면이 추가 논리를 사용

 execute immediate 'drop table '|| trec.table_name ||' cascade constraint'; 

이 외래 키 제약 조건을 삭제하지만, (이전) 종속 테이블을 떠난다.

+0

@NayanPaul - 죄송합니다. MySQL 전문가가 아닙니다 : 별도의 질문을하셔야합니다 – APC

0

제약 조건을 해제하고 제약 조건을 삭제하고 테이블을 삭제하는 데이 방법을 사용했습니다.

-- disable constraints on tables 
BEGIN 
    FOR c IN 
    (SELECT c.owner, c.table_name, c.constraint_name 
    FROM user_constraints c, user_tables t 
    WHERE c.table_name = t.table_name 
    AND t.table_name like 'WF_%' 
    AND c.status = 'ENABLED' 
    ORDER BY c.constraint_type DESC) 
    LOOP 
    dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" disable constraint ' || c.constraint_name); 
    END LOOP; 
END;    

-- drop the constraints 
begin 
    for r in (select table_name, constraint_name 
       from user_constraints where 
       table_name like 'WF_%') 
    loop 
     execute immediate 'alter table '||r.table_name 
          ||' drop constraint '||r.constraint_name; 
    end loop; 
end loop; 

-- drop the tables 
begin 
    for trec in (select table_name 
        from user_tables 
        where table_name like 'WF_%') 
    loop 
     execute immediate 'drop table '||trec.table_name|| ' purge'; 
    end loop; 
end; 
+0

자동 삭제 문에'purge'를 사용 하시겠습니까? 우리는 당신의 용감성에 감탄해야합니다! – APC

관련 문제