sql >> Database >  >> RDS >> Oracle

Detecteer, verwijder lege kolommen en werk de database bij in sql, oracle

U vraagt ​​een datadictionary-weergave op. Het toont meta-data , in formatie over de database. Deze weergave, ALL_TAB_COLUMNS, toont informatie voor elke kolom van elke tabel (je hebt privileges). COLUMN_NAME kan noodzakelijkerwijs niet null zijn, daarom retourneert uw zoekopdracht geen rijen.

Wat u nu wilt doen, is elke tabel doorzoeken en uitzoeken welke kolommen geen gegevens bevatten. Dit vereist dynamische SQL. Je moet ALL_TAB_COLUMNS doorzoeken, dus je was niet helemaal off-base.

Vanwege dynamische SQL is dit een programmatische oplossing, dus de resultaten worden weergegeven met DBMS_OUTPUT.

set serveroutput on size unlimited 

Hier is een anonieme blokkering:het kan even duren voordat deze is uitgevoerd. De samenvoeging met USER_TABLES is nodig omdat kolommen uit weergaven zijn opgenomen in TAB_COLUMNS en we die niet in de resultatenset willen hebben.

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;

voorbeelduitvoer:

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> 

Elke kolom waarin COUNT=0 geen waarden bevat.

Of u dergelijke kolommen nu echt wilt laten vallen, is een andere zaak. U kunt programma's die van hen afhankelijk zijn, breken. Je hebt dus eerst een impactanalyse nodig. Dit is de reden waarom ik geen programma heb gemaakt dat automatisch de lege kolommen laat vallen. Ik denk dat dat een gevaarlijke praktijk zou zijn.

Het is van cruciaal belang dat wijzigingen in onze databasestructuur worden overwogen en gecontroleerd. Dus als ik ooit een oefening als deze zou doen, zou ik de uitvoer van het bovenstaande programma veranderen, zodat het een script van drop-kolom-statements produceerde die ik kon bekijken, bewerken en onder bronbeheer kon houden.




  1. .NET MVC3 instellen met MySQL

  2. Hoe kan ik een NoClassDefFoundError oplossen?

  3. mysqldb python ontsnapt? of %s?

  4. Een tabel neerzetten in SQL