Вие правите заявка за изглед на речник на данни. Показва мета-данни , информация за базата данни. Този изглед, ALL_TAB_COLUMNS, показва информация за всяка колона на всяка таблица (имате привилегии). Непременно COLUMN_NAME не може да бъде нула, следователно заявката ви не връща нито един ред.
Сега това, което искате да направите, е да направите заявка за всяка таблица и да намерите кои колони нямат данни в тях. Това изисква динамичен SQL. Ще трябва да направите запитване към ALL_TAB_COLUMNS, за да не сте напълно извън базата.
Поради динамичния SQL това е програмно решение, така че резултатите се показват с DBMS_OUTPUT.
set serveroutput on size unlimited
Ето един анонимен блок:може да отнеме известно време, за да се изпълни. Присъединяването към USER_TABLES е необходимо, тъй като колони от изгледи са включени в TAB_COLUMNS и не ги искаме в набора с резултати.
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;
примерен резултат:
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>
Всяка колона, в която COUNT=0 няма стойности.
Друг е въпросът дали наистина искате да премахнете такива колони. Може да счупите програми, които зависят от тях. Така че първо се нуждаете от анализ на въздействието. Ето защо не съм създал програма, която автоматично премахва празните колони. Мисля, че това би било опасна практика.
От решаващо значение е промените в структурата на нашата база данни да бъдат разгледани и одитирани. Така че, ако някога трябваше да предприема упражнение като това, бих променил изхода от програмата по-горе, така че да създаде скрипт от изявления за колони за изпускане, които мога да прегледам, редактирам и държа под контрол на източника.