Você está consultando uma exibição de dicionário de dados. Mostra metadados , em informações sobre o banco de dados. Esta visão, ALL_TAB_COLUMNS, mostra informações para cada coluna de cada tabela (você tem privilégios). Necessariamente COLUMN_NAME não pode ser nulo, portanto, sua consulta não retorna nenhuma linha.
Agora o que você quer fazer é consultar todas as tabelas e descobrir quais colunas não possuem dados nelas. Isso requer SQL dinâmico. Você precisará consultar ALL_TAB_COLUMNS, então você não estava completamente fora da base.
Devido ao SQL dinâmico, esta é uma solução programática, portanto, os resultados são exibidos com DBMS_OUTPUT.
set serveroutput on size unlimited
Aqui está um bloco anônimo:pode levar algum tempo para ser executado. A junção com USER_TABLES é necessária porque as colunas das visualizações estão incluídas em TAB_COLUMNS e não queremos isso no conjunto de resultados.
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;
saída de amostra:
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>
Qualquer coluna em que COUNT=0 não tenha valores.
Agora, se você realmente deseja descartar essas colunas, é uma questão diferente. Você pode quebrar programas que dependem deles. Então você precisa primeiro de uma análise de impacto. É por isso que não produzi um programa que elimina automaticamente as colunas vazias. Acho que seria uma prática perigosa.
É crucial que as alterações em nossa estrutura de banco de dados sejam consideradas e auditadas. Então, se eu fosse realizar um exercício como este, eu alteraria a saída do programa acima para que ele produzisse um script de instruções de soltar colunas que eu pudesse revisar, editar e manter sob controle de origem.