sql >> Base de Datos >  >> RDS >> Oracle

Detectar, eliminar columnas vacías y actualizar la base de datos en sql, oracle

Está consultando una vista de diccionario de datos. Muestra metadatos , información sobre la base de datos. Esta vista, ALL_TAB_COLUMNS, muestra información para cada columna de cada tabla (en la que tiene privilegios). COLUMN_NAME necesariamente no puede ser nulo, por lo que su consulta no devuelve filas.

Ahora lo que quiere hacer es consultar cada tabla y encontrar qué columnas no tienen datos. Esto requiere SQL dinámico. Tendrás que consultar ALL_TAB_COLUMNS, por lo que no estabas completamente fuera de lugar.

Debido a SQL dinámico, esta es una solución programática, por lo que los resultados se muestran con DBMS_OUTPUT.

set serveroutput on size unlimited 

Aquí hay un bloque anónimo:puede tardar algún tiempo en ejecutarse. La unión a USER_TABLES es necesaria porque las columnas de las vistas se incluyen en TAB_COLUMNS y no las queremos en el 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;

salida de muestra:

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> 

Cualquier columna en la que COUNT=0 no tenga valores.

Ahora bien, si realmente desea eliminar dichas columnas es un asunto diferente. Puede romper los programas que dependen de ellos. Por lo tanto, primero necesita un análisis de impacto. Es por eso que no he producido un programa que elimine automáticamente las columnas vacías. Creo que sería una práctica peligrosa.

Es crucial que los cambios en la estructura de nuestra base de datos sean considerados y auditados. Entonces, si alguna vez tuviera que realizar un ejercicio como este, alteraría la salida del programa anterior para que produjera un script de declaraciones de columnas desplegables que podría revisar, editar y mantener bajo control de código fuente.