Oracle
 sql >> база данни >  >> RDS >> Oracle

Откриване, изтриване на празни колони и актуализиране на база данни в sql, oracle

Вие правите заявка за изглед на речник на данни. Показва мета-данни , информация за базата данни. Този изглед, ALL_TAB_COLUMNS, показва информация за всяка колона на всяка таблица (имате привилегии). Непременно COLUMN_NAME не може да бъде нула, следователно заявката ви не връща нито един ред.

Сега това, което искате да направите, е да направите заявка за всяка таблица и да намерите кои колони нямат данни в тях. Това изисква динамичен SQL. Ще трябва да направите запитване към ALL_TAB_COLUMNS, за да не сте напълно извън базата.

Поради динамичния SQL това е програмно решение, така че резултатите се показват с DBMS_OUTPUT.

set serveroutput on size unlimited 

Ето един анонимен блок:може да отнеме известно време, за да се изпълни. Присъединяването към USER_TABLES е необходимо, тъй като колони от изгледи са включени в TAB_COLUMNS и не ги искаме в набора с резултати.

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;

примерен резултат:

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> 

Всяка колона, в която COUNT=0 няма стойности.

Друг е въпросът дали наистина искате да премахнете такива колони. Може да счупите програми, които зависят от тях. Така че първо се нуждаете от анализ на въздействието. Ето защо не съм създал програма, която автоматично премахва празните колони. Мисля, че това би било опасна практика.

От решаващо значение е промените в структурата на нашата база данни да бъдат разгледани и одитирани. Така че, ако някога трябваше да предприема упражнение като това, бих променил изхода от програмата по-горе, така че да създаде скрипт от изявления за колони за изпускане, които мога да прегледам, редактирам и държа под контрол на източника.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не може да се изпълни голяма динамична заявка за избор в съхранена процедура

  2. Oracle LIMIT и ограничение от 1000 колони

  3. Има ли начин да се преодолее DSRA9010E 'setReadOnly' не се поддържа от изключението WebSphere?

  4. Разберете към кое тримесечие принадлежи датата в Oracle

  5. Свържете се с Oracle SQL в Katalon Studio