Bạn đang truy vấn chế độ xem từ điển dữ liệu. Nó hiển thị siêu dữ liệu , đang hình thành về cơ sở dữ liệu. Chế độ xem này, ALL_TAB_COLUMNS, hiển thị thông tin cho mọi cột của mọi bảng (bạn có đặc quyền trên). Nhất thiết COLUMN_NAME không được rỗng, do đó truy vấn của bạn không trả về hàng nào.
Bây giờ những gì bạn muốn làm là truy vấn mọi bảng và tìm cột nào không có dữ liệu trong đó. Điều này yêu cầu SQL động. Bạn sẽ cần phải truy vấn ALL_TAB_COLUMNS, vì vậy bạn không hoàn toàn lạc quan.
Do SQL động, đây là một giải pháp có lập trình, vì vậy kết quả được hiển thị với DBMS_OUTPUT.
set serveroutput on size unlimited
Đây là một khối ẩn danh:có thể mất một chút thời gian để chạy. Việc kết hợp với USER_TABLES là cần thiết vì các cột từ các chế độ xem được bao gồm trong TAB_COLUMNS và chúng tôi không muốn các cột đó trong tập kết quả.
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;
đầu ra mẫu:
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>
Bất kỳ cột nào có COUNT =0 không có giá trị nào trong đó.
Bây giờ bạn có thực sự muốn bỏ các cột như vậy hay không là một vấn đề khác. Bạn có thể phá vỡ các chương trình phụ thuộc vào chúng. Vì vậy, bạn cần phân tích tác động trước. Đây là lý do tại sao tôi không tạo ra một chương trình tự động loại bỏ các cột trống. Tôi nghĩ rằng đó sẽ là một thực hành nguy hiểm.
Điều quan trọng là các thay đổi đối với cấu trúc cơ sở dữ liệu của chúng tôi phải được xem xét và kiểm tra. Vì vậy, nếu tôi đã từng thực hiện một bài tập như thế này, tôi sẽ thay đổi đầu ra từ chương trình ở trên để nó tạo ra một tập lệnh gồm các câu lệnh cột thả mà tôi có thể xem lại, chỉnh sửa và giữ dưới sự kiểm soát của nguồn.