Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Deteksi, hapus kolom kosong dan perbarui basis data di sql, oracle

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara mendapatkan nilai UTC untuk SYSDATE di Oracle

  2. 4 Cara Menemukan Baris yang Mengandung Huruf Kecil di Oracle

  3. Indeks waktu-konstan untuk kolom string pada database Oracle

  4. Bagaimana menjalankan file .sql di alat pengembang Oracle SQL untuk mengimpor database?

  5. Cara mengaktifkan ekstensi untuk oci8 (Oracle) di php.ini - PHP Warning:PHP Startup:in Unknown on line 0