2013-11-22 16 views
10

Wiem, że to pytanie może zadawać wiele razy, ale nie mogłem znaleźć jednej liniowej instrukcji SQL. Pamiętam, że zrobiłem to wcześniej, ale teraz nie mogłem sobie przypomnieć, jak to zrobiłemUPUŚĆ wszystkie tabele zaczynające się od "EXT_" w Oracle SQL

Chcę upuścić wszystkie tabele, których nazwa zaczyna się od "EXT_". Czy to możliwe, aby stało się to za pomocą jednego wiersza instrukcji SQL.

Odpowiedz

25

Możesz użyć krótkiego anonimowego bloku, aby to zrobić.

BEGIN 
    FOR c IN (SELECT table_name FROM user_tables WHERE table_name LIKE 'EXT_%') 
    LOOP 
    EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name; 
    END LOOP; 
END; 
+1

Uwzględnij także "ograniczenia kaskadowe", aby kolejność upuszczania tych tabel nie stanowiła problemu, jeśli w grę wchodzą klucze obce. – talek

6

Nie jest to możliwe przy użyciu tylko jednej instrukcji. Zazwyczaj piszę sql, aby uzyskać wszystkie tabele, a następnie wykonać wyniki:

select 'drop table ' || table_name || ';' 
from user_tables 
where table_name like 'EXT_%'; 
+2

Skopiowanie wszystkich i wykonanie ich może być łatwe dzięki temu. wybierz "drop table" || nazwa_tabeli || "; 'od user_tables gdzie table_name lubię' EXT_% '; –

+0

Tak, właśnie o to mi chodzi. Wykonaj to zapytanie, skopiuj/wklej wyniki i wykonaj instrukcje. –

2

Ten kod będzie DROP nie tylko tabel EXT_%, będzie również działać jako DROP EXT%. Podkreślnik jest specjalnym symbolem wieloznacznym, który działa jak "%", ale dla pojedynczego znaku.

BEGIN 
    FOR c IN (SELECT table_name FROM user_tables WHERE table_name LIKE 'EXT_%') 
    LOOP 
    EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name; 
    END LOOP; 
END; 

W celu osiągniętych pożądanych rezultatów należy zmienić swój kod droga poniżej

BEGIN 
    FOR c IN (SELECT table_name FROM user_tables WHERE table_name LIKE 'EXT\_%' ESCAPE '\') 
    LOOP 
    EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name; 
    END LOOP; 
END; 

To ucieka podkreślenia char w celu trated dosłownie ESCAPE '\' modyfikator wskazuje, że escape char to '\'

1

W większości przypadków można znaleźć naruszenia przepisów. W takim przypadku ten skrypt może pomóc:

DECLARE 
    c_action CONSTANT VARCHAR2(10) := 'DROP'; 
BEGIN 
    FOR c IN (SELECT table_name FROM user_tables WHERE table_name LIKE 'STARTINGTEXT_%') 
    LOOP 

     FOR reg IN (SELECT uc.table_name, 
         uc.constraint_name 
       FROM user_constraints uc 
       WHERE uc.table_name IN (c.table_name)) LOOP 
      EXECUTE IMMEDIATE 'ALTER TABLE ' || reg.table_name || ' ' || c_action || 
         ' CONSTRAINT ' || reg.constraint_name ; 
      END LOOP; 

    END LOOP; 
COMMIT; 
    FOR c IN (SELECT table_name FROM user_tables WHERE table_name LIKE 'STARTINGTEXT_%') 
    LOOP 

      EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || c.table_name; 
      EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name; 
    END LOOP; 

END; 
Powiązane problemy