Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Detecte, exclua colunas vazias e atualize o banco de dados em sql, oracle


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.