Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

एसक्यूएल, ऑरेकल में खाली कॉलम का पता लगाएं, हटाएं और डेटाबेस अपडेट करें

आप डेटा डिक्शनरी व्यू को क्वेरी कर रहे हैं। यह मेटा-डेटा दिखाता है , डेटाबेस के बारे में गठन में। यह दृश्य, ALL_TAB_COLUMNS, प्रत्येक तालिका के प्रत्येक स्तंभ के लिए जानकारी दिखाता है (आपके पास विशेषाधिकार हैं)। अनिवार्य रूप से COLUMN_NAME रिक्त नहीं हो सकता, इसलिए आपकी क्वेरी कोई पंक्ति नहीं लौटाती है।

अब आप जो करना चाहते हैं वह प्रत्येक तालिका को क्वेरी करना है और यह पता लगाना है कि कौन से कॉलम में कोई डेटा नहीं है। इसके लिए गतिशील एसक्यूएल की आवश्यकता है। आपको 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. ORA-01002:अनुक्रम C++ से बाहर लाएं

  2. ORA-00933:एकाधिक पंक्तियों को सम्मिलित करते समय SQL कमांड ठीक से समाप्त नहीं हुआ

  3. Oracle अमान्य पहचानकर्ता स्ट्रिंग को नहीं समझता

  4. Oracle SQL चयन में पंक्तियों की संख्या?

  5. औसत समय अंतराल कैसे करें?