Anda menanyakan tampilan kamus data. Ini menunjukkan meta-data , dalam formasi tentang database. Tampilan ini, ALL_TAB_COLUMNS, menampilkan informasi untuk setiap kolom dari setiap tabel (Anda memiliki hak istimewa). COLUMN_NAME pasti tidak boleh nol, karena itu kueri Anda tidak mengembalikan baris.
Sekarang yang ingin Anda lakukan adalah menanyakan setiap tabel dan menemukan kolom mana yang tidak memiliki data di dalamnya. Ini membutuhkan SQL dinamis. Anda perlu menanyakan ALL_TAB_COLUMNS, jadi Anda tidak sepenuhnya salah.
Karena SQL dinamis, ini adalah solusi terprogram, jadi hasilnya ditampilkan dengan DBMS_OUTPUT.
set serveroutput on size unlimited
Ini adalah blok anonim:mungkin perlu beberapa saat untuk dijalankan. Penggabungan ke USER_TABLES diperlukan karena kolom dari tampilan disertakan dalam TAB_COLUMNS dan kami tidak ingin kolom tersebut ada di kumpulan hasil.
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;
contoh keluaran:
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>
Setiap kolom di mana COUNT=0 tidak memiliki nilai di dalamnya.
Sekarang apakah Anda benar-benar ingin menjatuhkan kolom seperti itu adalah masalah lain. Anda mungkin merusak program yang bergantung padanya. Jadi, Anda perlu analisis dampak terlebih dahulu. Inilah sebabnya mengapa saya belum membuat program yang secara otomatis menghapus kolom kosong. Saya pikir itu akan menjadi praktik yang berbahaya.
Sangat penting bahwa perubahan struktur database kami dipertimbangkan dan diaudit. Jadi jika saya melakukan latihan seperti ini, saya akan mengubah output dari program di atas sehingga menghasilkan skrip pernyataan kolom drop yang dapat saya tinjau, edit, dan simpan di bawah kendali sumber.