Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wykrywaj, usuwaj puste kolumny i aktualizuj bazę danych w sql, oracle

Wysyłasz zapytanie do widoku słownika danych. Pokazuje metadane , w informacji o bazie danych. Ten widok, ALL_TAB_COLUMNS, pokazuje informacje dla każdej kolumny każdej tabeli (do której masz uprawnienia). Koniecznie COLUMN_NAME nie może mieć wartości NULL, dlatego zapytanie nie zwraca żadnych wierszy.

Teraz chcesz wykonać zapytanie do każdej tabeli i znaleźć kolumny, w których nie ma żadnych danych. Wymaga to dynamicznego SQL. Musisz wysłać zapytanie do ALL_TAB_COLUMNS, więc nie jesteś całkowicie poza bazą.

Ze względu na dynamiczny SQL jest to rozwiązanie programowe, więc wyniki są wyświetlane z DBMS_OUTPUT.

set serveroutput on size unlimited 

Oto anonimowy blok:uruchomienie może zająć trochę czasu. Połączenie z USER_TABLES jest konieczne, ponieważ kolumny z widoków są zawarte w TAB_COLUMNS i nie chcemy ich w zestawie wyników.

declare
    dsp varchar2(32767);
    stmt varchar2(32767);
begin
    << tab_loop >>
    for trec in ( select t.table_name
                 from user_tables t )
    loop
        stmt := 'select ';
        dbms_output.put_line('table name = '|| trec.table_name);
        << col_loop >>
        for crec in ( select c.column_name
                             , row_number() over (order by c.column_id) as rn
                      from user_tab_columns c
                      where c.table_name = trec.table_name  
                      and c.nullable = 'Y'
                      order by c.column_id )
        loop
            if rn > 1 then stmt := concat(stmt, '||'); end if;
            stmt := stmt||''''||crec.column_name||'=''||'
                        ||'to_char(count('||crec.column_name||')) ';
        end loop col_loop;
        stmt := stmt || ' from '||trec.table_name;
        execute immediate stmt into dsp;
        dbms_output.put_line(dsp);
    end loop tab_loop;
end;

przykładowe wyjście:

table name = MY_PROFILER_RUN_EVENTS
TOT_EXECS=0TOT_TIME=0MIN_TIME=0MAX_TIME=0
table name = LOG_TABLE
PKG_NAME=0MODULE_NAME=0CLIENT_ID=0

PL/SQL procedure successfully completed.

SQL> 

Każda kolumna, w której LICZBA=0 nie zawiera żadnych wartości.

Teraz, czy rzeczywiście chcesz usunąć takie kolumny, to już inna sprawa. Możesz zepsuć programy, które od nich zależą. Więc najpierw potrzebujesz analizy wpływu. Dlatego nie stworzyłem programu, który automatycznie usuwa puste kolumny. Myślę, że byłaby to niebezpieczna praktyka.

Ważne jest, aby zmiany w naszej strukturze bazy danych były brane pod uwagę i audytowane. Więc gdybym kiedykolwiek wykonał takie ćwiczenie, zmieniłbym dane wyjściowe z powyższego programu, aby wytworzył skrypt instrukcji upuszczania kolumn, który mógłbym przeglądać, edytować i utrzymywać pod kontrolą źródła.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyodrębnij datę z wyroczni łańcuchowej

  2. Błąd:[email protected] install:`node-gyp rebuild` podczas instalowania modułu oracledb

  3. Nie znaleziono słowa kluczowego FROM w oczekiwanym miejscu (Oracle SQL)

  4. Programista PL/SQL, jak uzyskać wiersz, który spowodował niepowodzenie wstawiania?

  5. Jak zliczyć(*) wiele tabel, rozmiar i przestrzeń tabel w jednym zapytaniu?