sql >> Databasteknik >  >> RDS >> Oracle

Upptäck, ta bort tomma kolumner och uppdatera databasen i sql, oracle

Du frågar efter en datalexikon. Den visar metadata , information om databasen. Denna vy, ALL_TAB_COLUMNS, visar information för varje kolumn i varje tabell (du har privilegier på). COLUMN_NAME kan nödvändigtvis inte vara null, därför returnerar din fråga inga rader.

Vad du nu vill göra är att fråga varje tabell och hitta vilka kolumner som inte innehåller några data. Detta kräver dynamisk SQL. Du måste fråga ALL_TAB_COLUMNS, så du var inte helt utanför basen.

På grund av dynamisk SQL är detta en programmatisk lösning, så resultaten visas med DBMS_OUTPUT.

set serveroutput on size unlimited 

Här är ett anonymt block:det kan ta lite tid att köra. Anslutningen till USER_TABLES är nödvändig eftersom kolumner från vyer ingår i TAB_COLUMNS och vi vill inte ha dem i resultatuppsättningen.

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;

exempelutdata:

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> 

Alla kolumner där COUNT=0 inte har några värden.

Om du verkligen vill ta bort sådana kolumner är en annan sak. Du kan bryta program som är beroende av dem. Så du behöver en konsekvensanalys först. Det är därför jag inte har producerat ett program som automatiskt släpper de tomma kolumnerna. Jag tror att det skulle vara farligt.

Det är avgörande att ändringar i vår databasstruktur beaktas och granskas. Så om jag någonsin skulle göra en övning som denna skulle jag ändra utdata från programmet ovan så att det producerade ett skript med släppkolumnsatser som jag kunde granska, redigera och hålla under källkontroll.




  1. Integration av postgreSQL på WAMP

  2. Hur förfinar man utdata som kommer från SELECT-frågan i kommandotolken?

  3. MySQL-applikationsanvändare kontra databasanvändare

  4. Kolumnrad Transponera i Oracle Sql