sql >> Databáze >  >> RDS >> Oracle

Detekce, odstranění prázdných sloupců a aktualizace databáze v SQL, Oracle

Dotazujete se na zobrazení datového slovníku. Zobrazuje metadata , ve formaci o databázi. Tento pohled, ALL_TAB_COLUMNS, zobrazuje informace pro každý sloupec každé tabulky (máte oprávnění). COLUMN_NAME nutně nemůže být null, proto váš dotaz nevrací žádné řádky.

Nyní chcete udělat dotaz na každou tabulku a zjistit, ve kterých sloupcích nejsou žádná data. To vyžaduje dynamické SQL. Budete muset zadat dotaz na ALL_TAB_COLUMNS, takže jste nebyli úplně mimo základnu.

Vzhledem k dynamickému SQL se jedná o programové řešení, takže výsledky jsou zobrazeny s DBMS_OUTPUT.

set serveroutput on size unlimited 

Zde je anonymní blok:spuštění může chvíli trvat. Spojení s USER_TABLES je nezbytné, protože sloupce ze zobrazení jsou zahrnuty v TAB_COLUMNS a my je nechceme v sadě výsledků.

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;

ukázkový výstup:

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> 

Jakýkoli sloupec, kde COUNT=0 nemá žádné hodnoty.

To, zda skutečně chcete takové sloupce vypustit, je jiná věc. Můžete přerušit programy, které na nich závisí. Nejprve tedy potřebujete analýzu dopadu. To je důvod, proč jsem nevytvořil program, který automaticky zahodí prázdné sloupce. Myslím, že by to byla nebezpečná praxe.

Je zásadní, aby byly zváženy a auditovány změny ve struktuře naší databáze. Takže pokud bych někdy provedl cvičení jako je toto, upravil bych výstup z výše uvedeného programu tak, aby vytvořil skript příkazů drop sloupců, který bych mohl kontrolovat, upravovat a udržovat pod kontrolou zdroje.




  1. Náhrada podřetězce UPDATE PostgreSQL

  2. Formát data v MySQL SELECT jako ISO 8601

  3. Geokodér Map Google pro vyhledání míst v okolí z databáze MySQL

  4. Oracle sql - najděte společné položky zakoupené mezi dvěma uživateli