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.