Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Erkennen, löschen Sie leere Spalten und aktualisieren Sie die Datenbank in SQL, Oracle

Sie fragen eine Data-Dictionary-Ansicht ab. Es zeigt Metadaten , Informationen über die Datenbank. Diese Ansicht, ALL_TAB_COLUMNS, zeigt Informationen für jede Spalte jeder Tabelle (für die Sie Berechtigungen haben). COLUMN_NAME darf nicht unbedingt null sein, daher gibt Ihre Abfrage keine Zeilen zurück.

Jetzt möchten Sie jede Tabelle abfragen und herausfinden, welche Spalten keine Daten enthalten. Dies erfordert dynamisches SQL. Sie müssen ALL_TAB_COLUMNS abfragen, damit Sie nicht völlig falsch liegen.

Aufgrund von dynamischem SQL ist dies eine programmatische Lösung, daher werden die Ergebnisse mit DBMS_OUTPUT.

angezeigt
set serveroutput on size unlimited 

Hier ist ein anonymer Block:Es kann einige Zeit dauern, bis er ausgeführt wird. Der Join zu USER_TABLES ist notwendig, da Spalten aus Views in TAB_COLUMNS enthalten sind und wir diese nicht in der Ergebnismenge haben wollen.

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;

Beispielausgabe:

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> 

Jede Spalte, in der COUNT=0 keine Werte enthält.

Ob Sie solche Spalten nun wirklich löschen wollen, ist eine andere Frage. Sie könnten Programme beschädigen, die von ihnen abhängen. Sie brauchen also zuerst eine Wirkungsanalyse. Deshalb habe ich kein Programm erstellt, das die leeren Spalten automatisch löscht. Ich denke, das wäre eine gefährliche Vorgehensweise.

Es ist von entscheidender Bedeutung, dass Änderungen an unserer Datenbankstruktur berücksichtigt und geprüft werden. Wenn ich also jemals eine Übung wie diese durchführen würde, würde ich die Ausgabe des obigen Programms so ändern, dass es ein Skript mit Drop-Column-Anweisungen erzeugt, das ich überprüfen, bearbeiten und unter Quellcodeverwaltung halten kann.