sql >> Database teknologi >  >> RDS >> Oracle

Opdag, slet tomme kolonner og opdater database i sql, oracle

Du forespørger i en dataordbogsvisning. Den viser metadata , i information om databasen. Denne visning, ALL_TAB_COLUMNS, viser information for hver kolonne i hver tabel (du har privilegier på). COLUMN_NAME kan nødvendigvis ikke være null, derfor returnerer din forespørgsel ingen rækker.

Det, du nu vil gøre, er at forespørge i hver tabel og finde ud af, hvilke kolonner der ikke indeholder data. Dette kræver dynamisk SQL. Du bliver nødt til at forespørge ALL_TAB_COLUMNS, så du var ikke helt off-base.

På grund af dynamisk SQL er dette en programmatisk løsning, så resultaterne vises med DBMS_OUTPUT.

set serveroutput on size unlimited 

Her er en anonym blok:det kan tage lidt tid at køre. Sammenføjningen til USER_TABLES er nødvendig, fordi kolonner fra visninger er inkluderet i TAB_COLUMNS, og vi vil ikke have dem i resultatsættet.

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;

eksempel output:

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> 

Enhver kolonne, hvor COUNT=0 ikke har nogen værdier.

Om du faktisk ønsker at droppe sådanne kolonner er en anden sag. Du kan bryde programmer, der afhænger af dem. Så du har brug for en konsekvensanalyse først. Det er grunden til, at jeg ikke har lavet et program, som automatisk dropper de tomme kolonner. Jeg tror, ​​det ville være farlig praksis.

Det er afgørende, at ændringer i vores databasestruktur overvejes og revideres. Så hvis jeg nogensinde skulle lave en øvelse som denne, ville jeg ændre outputtet fra programmet ovenfor, så det producerede et script med drop-søjleudsagn, som jeg kunne gennemgå, redigere og holde under kildekontrol.




  1. Hurtigste postgreSQL svarende til MySQL UTC_DATE() (får UTC-dato)?

  2. Sådan indstilles det aktuelle sprog i SQL Server (T-SQL)

  3. Django modellerer en fremmednøgle til mange borde

  4. Har brug for hjælp til at udføre øjeblikkelig opdateringsforespørgsel